| /*-------------------------------------------------------------------------- |
| * Smooth Scroller Script, version 1.0.1 |
| * (c) 2007 Dezinerfolio Inc. <midart@gmail.com> |
| * |
| * For details, please check the website : http://dezinerfolio.com/ |
| * |
| *--------------------------------------------------------------------------*/ |
| |
| /*jshint boss: true */ |
| /*jslint plusplus: true */ |
| |
| |
| var Scroller = (function () { |
| "use strict"; |
| |
| var onclickHandler = function () { |
| Scroller.end(this); |
| var l = this.hash.substr(1), |
| a = document.getElementsByTagName('a'), |
| i; |
| for (i = 0; i < a.length; i++) { |
| if (a[i].id === l) { |
| clearInterval(Scroller.interval); |
| Scroller.interval = setInterval( |
| 'Scroller.scroll(' + Scroller.gy(a[i]) + ')', |
| 10 |
| ); |
| } |
| } |
| }; |
| |
| return { |
| // control the speed of the scroller. |
| // don't change it here directly, please use Scroller.speed=50; |
| speed: 10, |
| |
| // returns the Y position of the div |
| gy: function (d) { |
| var gy = d.offsetTop; |
| while (d = d.offsetParent) { |
| gy += d.offsetTop; |
| } |
| return gy; |
| }, |
| |
| // returns the current scroll position |
| scrollTop: function () { |
| var body = document.body, |
| d = document.documentElement; |
| if (body && body.scrollTop) { |
| return body.scrollTop; |
| } |
| if (d && d.scrollTop) { |
| return d.scrollTop; |
| } |
| if (window.pageYOffset) { |
| return window.pageYOffset; |
| } |
| return 0; |
| }, |
| |
| // attach an event for an element |
| // (element, type, function) |
| add: function (event, body, d) { |
| if (event.addEventListener) { |
| return event.addEventListener(body, d, false); |
| } |
| if (event.attachEvent) { |
| return event.attachEvent('on' + body, d); |
| } |
| return null; |
| }, |
| |
| // kill an event of an element |
| end: function (e) { |
| if (e.preventDefault && e.stopPropagation) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| } else if (window.event) { |
| window.event.cancelBubble = true; |
| window.event.returnValue = false; |
| } |
| }, |
| |
| // move the scroll bar to the particular div. |
| scroll: function (d) { |
| var a = Scroller.scrollTop(); |
| if (d > a) { // going down |
| a += Math.ceil((d - a) / Scroller.speed); |
| } else { // going up |
| a = a + (d - a) / Scroller.speed; |
| } |
| window.scrollTo(0, a); |
| if (a === d || Scroller.offsetTop === a) { |
| clearInterval(Scroller.interval); |
| } |
| Scroller.offsetTop = a; |
| }, |
| |
| // initializer that adds the renderer to the onload function of |
| // the window |
| init: function () { |
| Scroller.add(window, 'load', Scroller.render); |
| }, |
| |
| // this method extracts all the anchors and validates then as # |
| // and attaches the events. |
| render: function () { |
| Scroller.end(this); |
| var a = document.getElementsByTagName('a'); |
| for (var i = 0; i < a.length; i++) { |
| var l = a[i], |
| has_hash = l.href && l.href.indexOf('#') !== -1, |
| is_cur_loc = l.pathname === location.pathname; |
| is_cur_loc |= '/' + l.pathname === location.pathname; |
| if (has_hash && is_cur_loc) { |
| Scroller.add(l, 'click', Scroller.end); |
| l.onclick = onclickHandler; |
| } |
| } |
| } |
| }; |
| |
| }()); |
| |
| // invoke the initializer of the scroller |
| Scroller.init(); |
| |
| /*------------------------------------------------------------ |
| * END OF CODE |
| *-----------------------------------------------------------*/ |