/*!
 * Documenter 2.0
 * http://rxa.li/documenter
 *
 * Copyright 2011, Xaver Birsak
 * http://revaxarts.com
 *
 */

$(document).ready(function () {
    var timeout,
        sections = new Array(),
        sectionscount = 0,
        win = $(window),
        sidebar = $('#documenter_sidebar'),
        nav = $('#documenter_nav'),
        logo = $('#documenter_logo'),
        navanchors = nav.find('a'),
        timeoffset = 50,
        hash = location.hash || null;
    iDeviceNotOS4 = (navigator.userAgent.match(/iphone|ipod|ipad/i) && !navigator.userAgent.match(/OS 5/i)) || false,
        badIE = $('html').prop('class').match(/ie(6|7|8)/) || false;

    //handle external links (new window)
    $('a[href^=http]').bind('click', function () {
        window.open($(this).attr('href'));
        return false;
    });

    //IE 8 and lower doesn't like the smooth pagescroll
    if (!badIE) {
        window.scroll(0, 0);

        $('a[href^=#]').bind('click touchstart', function () {
            hash = $(this).attr('href');
            $.scrollTo.window().queue([]).stop();
            goTo(hash);
            return false;
        });

        //if a hash is set => go to it
        if (hash) {
            setTimeout(function () {
                goTo(hash);
            }, 500);
        }
    }


    //We need the position of each section until the full page with all images is loaded
    win.bind('load', function () {

        var sectionselector = 'section';

        //Documentation has subcategories
        if (nav.find('ol').length) {
            sectionselector = 'section, h4';
        }
        //saving some information
        $(sectionselector).each(function (i, e) {
            var _this = $(this);
            var p = {
                id: this.id,
                pos: _this.offset().top
            };
            sections.push(p);
        });


        //iPhone, iPod and iPad don't trigger the scroll event
        if (iDeviceNotOS4) {
            nav.find('a').bind('click', function () {
                setTimeout(function () {
                    win.trigger('scroll');
                }, duration);

            });
            //scroll to top
            window.scroll(0, 0);
        }

        //how many sections
        sectionscount = sections.length;

        //bind the handler to the scroll event
        win.bind('scroll', function (event) {
            clearInterval(timeout);
            //should occur with a delay
            timeout = setTimeout(function () {
                //get the position from the very top in all browsers
                pos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

                //iDeviceNotOS4s don't know the fixed property so we fake it
                if (iDeviceNotOS4) {
                    sidebar.css({height: document.height});
                    logo.css({'margin-top': pos});
                }
                //activate Nav element at the current position
                activateNav(pos);
            }, timeoffset);
        }).trigger('scroll');

    });

    //the function is called when the hash changes
    function hashchange() {
        goTo(location.hash, false);
    }

    //scroll to a section and set the hash
    function goTo(hash, changehash) {
        win.unbind('hashchange', hashchange);
        hash = hash.replace(/!\//, '');
        win.stop().scrollTo(hash, duration, {
            easing: easing,
            axis: 'y'
        });
        if (changehash !== false) {
            var l = location;
            location.href = (l.protocol + '//' + l.host + l.pathname + '#!/' + hash.substr(1));
        }
        win.bind('hashchange', hashchange);
    }


    //activate current nav element
    function activateNav(pos) {
        var offset = 100,
            current, next, parent, isSub, hasSub;
        win.unbind('hashchange', hashchange);
        for (var i = sectionscount; i > 0; i--) {
            if (sections[i - 1].pos <= pos + offset) {
                navanchors.removeClass('current');
                current = navanchors.eq(i - 1);
                current.addClass('current');

                parent = current.parent().parent();
                next = current.next();

                hasSub = next.is('ul');
                isSub = !parent.is('#documenter_nav');

                nav.find('ol:visible').not(parent).slideUp('fast');
                if (isSub) {
                    parent.prev().addClass('current');
                    parent.stop().slideDown('fast');
                } else if (hasSub) {
                    next.stop().slideDown('fast');
                }
                win.bind('hashchange', hashchange);
                break;
            }
            ;
        }
    }

    // make code pretty
    window.prettyPrint && prettyPrint();

});