/*--------------------------------------------------------------------------
 *  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
 *-----------------------------------------------------------*/