(function($){

    var sumArray = function(arr){
        var sum = 0;
        for (var i = arr.length - 1; i >= 0; i--) {
            sum += arr[i];
        }
        return sum;
    };

    $.fn.timelineify = function(){
        this.each(function(){
            var $timeline             = $(this),
                $date_elements        = $timeline.find('dt'),
                $description_elements = $timeline.find('dd'),
                node_years            = [],
                min_year,
                max_year,
                i;

            $timeline.addClass('timelinejs-timeline').removeClass('noscript');
            $description_elements.eq(0).addClass('current');

            $date_elements.each(function(i, el){
                node_years[i] = $(el).attr('data-decimalyear');
                min_year = (min_year < Math.floor(node_years[i])) ? min_year : Math.floor(node_years[i]);
                max_year = (max_year > Math.floor(node_years[i])) ? max_year : Math.floor(node_years[i]);
            });
            var event_pickers = document.createElement('div');
            $(event_pickers).addClass('timelinejs-pickers');
            $date_elements.each(function(i, el){
                var picker = document.createElement('div');
                picker.appendChild(document.createTextNode('\u2022'));
                $(picker).css({
                    'left': (node_years[i] - min_year) / (max_year - min_year + 1) * 100 + '%'
                });
                event_pickers.appendChild(picker);
            });
            $(event_pickers).find('div').eq(0).addClass('current');
            var line = document.createElement('div');
            $(line).addClass('timelinejs-line');
            var year_entry;
            for (i = min_year; i <= max_year; i++) {
                year_entry = document.createElement('div');
                year_entry.appendChild(document.createTextNode(i));
                $(year_entry).addClass('timelinejs-year').css({
                    'left': (i - min_year + 0.5) / (max_year - min_year + 1) * 100 + '%'
                });
                line.appendChild(year_entry);
            }
            var year_divider;
            for (i = min_year; i < max_year; i++) {
                year_divider = document.createElement('div');
                $(year_divider).addClass('timelinejs-year-divider').css({
                    'left': (i + 1 - min_year) / (max_year - min_year + 1) * 100 + '%'
                });
                line.appendChild(year_divider);
            }
            $timeline.prepend(event_pickers);
            $timeline.prepend(line);

            var pickerClick = function(){
                var clicked_element = this,
                    $pickers = $(event_pickers).find('div');
                $pickers.removeClass('current');
                $description_elements.removeClass('current');
                $(this).addClass('current');
                $description_elements.eq($(this).index()).addClass('current');
            };

            $(event_pickers).find('div').click(pickerClick);
        });
    };

    $.fn.drawerify = function(){
        this.each(function(){
            var $drawers = $(this),
                $dts = $drawers.find('dt'),
                $dds = $drawers.find('dd');

            $drawers.addClass('drawerify').removeClass('noscript');
            $dds.addClass('current');
            $dts.eq(0).addClass('current');
            setTimeout(function(){
                var dtsum = 1 +
                    sumArray($dts.map(function(){return $(this).outerHeight();}).get()) -
                    parseInt($dds.css('border-top-width'), 10) -
                    parseInt($dds.css('padding-top'), 10) -
                    parseInt($dds.css('padding-bottom'), 10) -
                    parseInt($dds.css('border-bottom-width'), 10);
                var max_height = Math.max(dtsum, Math.max.apply(null, $dds.map(function(){
                    return $(this).height();
                }).get()));
                var max_outer_height = Math.max.apply(null, $dds.map(function(){
                    return $(this).outerHeight();
                }).get());
                $drawers.css('min-height', max_outer_height + 'px');
                $dds.height(max_height);
                $dds.removeClass('current');
                $dds.eq(0).addClass('current');
            }, 0);

            var dtClick = function(){
                $dts.removeClass('current').eq($dts.index(this)).addClass('current');
                $dds.removeClass('current').eq($dts.index(this)).addClass('current');
            };

            $dts.click(dtClick);
        });
        return this;
    };

    var autoTransitionFeatureTabs = function(){
        var feature_tabs = $('#featuretabs.autotransition a');
        if (feature_tabs.length > 0) {
            var feature_slides = $('#feature .featureslide');
            var primary_slide_content = $('#feature .slide_primary');
            var secondary_slide_content = $('#feature .slide_secondary');
            var more = $('#feature .feature_more');

            var activatePrimary = function(){
                secondary_slide_content.hide();
                primary_slide_content.show();
            };

            var activateSecondary = function(){
                primary_slide_content.hide();
                secondary_slide_content.show();
            };

            var setActiveTab = function(index){
                feature_tabs.parent().removeClass('current');
                feature_tabs.eq(index).parent().addClass('current');
                feature_slides.removeClass('current');
                feature_slides.eq(index).addClass('current');
                activatePrimary();
            };

            var tabClick = function(ev){
                setActiveTab($(this).parent().index());
            };

            var nextSlide = function(){
                var index = $('#featuretabs.autotransition .current').index() + 1;
                if (index >= feature_tabs.length) {
                    index = 0;
                }
                setActiveTab(index);
            };

            feature_tabs.click(tabClick);
            more.
                click(activateSecondary).
                css('cursor', 'pointer').
                css('display', 'block');
        }
    };

    $(document).ready(function(){
        $('.timeline').timelineify();
        $('.feature-drawers').drawerify();
        autoTransitionFeatureTabs();
    });

})(jQuery);

