/* =========================================================
 * bootstrap-tabdrop.js 
 * http://www.eyecon.ro/bootstrap-tabdrop
 * =========================================================
 * Copyright 2012 Stefan Petre
 *
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 * NOTICE: Changes made 2019 by Nathan Brown, Competitive Computing:
 * Added ADA support for HTML being injected into page.
 * 
 * ========================================================= */

!function ($) {

    var WinReszier = (function () {
        var registered = [];
        var inited = false;
        var timer;
        var resize = function (ev) {
            clearTimeout(timer);
            timer = setTimeout(notify, 100);
        };
        var notify = function () {
            for (var i = 0, cnt = registered.length; i < cnt; i++) {
                registered[i].apply();
            }
        };
        return {
            register: function (fn) {
                registered.push(fn);
                if (inited === false) {
                    $(window).bind('resize', resize);
                    inited = true;
                }
            },
            unregister: function (fn) {
                for (var i = 0, cnt = registered.length; i < cnt; i++) {
                    if (registered[i] == fn) {
                        delete registered[i];
                        break;
                    }
                }
            }
        }
    }());

    var TabDrop = function (element, options) {
        this.element = $(element);
        this.dropdown = $('<li class="dropdown hide pull-right tabdrop" aria-hidden="true"><a role="tab" class="dropdown-toggle" data-toggle="dropdown" id="tabdrop-menu" aria-expanded="false" aria-label="Open and Close Dropdown" href="#">' + options.text + ' <b class="caret"></b></a><ul class="dropdown-menu" aria-labelledby="tabdrop-menu"></ul></li>')
							.appendTo(this.element);
        if (this.element.parent().is('.tabs-below')) {
            this.dropdown.addClass('dropup');
        }
        WinReszier.register($.proxy(this.layout, this));
        this.layout();
    };

    TabDrop.prototype = {
        constructor: TabDrop,

        layout: function () {
            var collection = [];
            // Task 4676: Need to temporarily set the left padding of the first tab element to the dropdown width so we can correctly calculate which tabs overflow. 
            // The reason this is needed now is because we are appending (instead of prepending) the dropdown to the tablist to be ADA compliant (elements need to show up in logical order).
            this.element.find('>li').not('.tabdrop').first().css({ 'padding-left': this.dropdown.width() + 'px' });
            this.element.remove('.tabdrop');
            this.dropdown.addClass('hide');
            this.dropdown.attr("aria-hidden", "true");
            this.element
				.append(this.dropdown.find('li'))
				.find('>li')
				.not('.tabdrop')
				.each(function () {
				    if (this.offsetTop > 0) {
				        collection.push(this);
				    }
				});
            if (collection.length > 0) {
                collection = $(collection);
                this.dropdown
					.find('ul')
					.empty()
					.append(collection);
                if (this.dropdown.find('.active').length == 1) {
                    this.dropdown.addClass('active');
                } else {
                    this.dropdown.removeClass('active');
                }
                this.dropdown.removeClass('hide');
                this.dropdown.attr("aria-hidden", "false");
            }
            this.dropdown.appendTo(this.element);
            this.element.find('>li').not('.tabdrop').first().css({'padding-left': '0px'});
        }
    }

    $.fn.tabdrop = function (option) {
        return this.each(function () {
            var $this = $(this),
				data = $this.data('tabdrop'),
				options = typeof option === 'object' && option;
            if (!data) {
                $this.data('tabdrop', (data = new TabDrop(this, $.extend({}, $.fn.tabdrop.defaults, options))));
            }
            if (typeof option == 'string') {
                data[option]();
            }
        })
    };

    $.fn.tabdrop.defaults = {
    	text: '<i class="glyphicon glyphicon-align-justify" aria-hidden="true"></i>'
    };

    $.fn.tabdrop.Constructor = TabDrop;

}(window.jQuery);
