/**
 * vAccordion - AngularJS multi-level accordion component
 * @version v1.4.1
 * @link http://lukaszwatroba.github.io/v-accordion
 * @author Łukasz Wątroba <l@lukaszwatroba.com>
 * @license MIT License, http://www.opensource.org/licenses/MIT
 */

!function(e){"use strict";function n(n){return{restrict:"E",transclude:!0,controller:i,scope:{control:"=?",allowMultiple:"=?multiple",expandCb:"&?onexpand",collapseCb:"&?oncollapse",id:"@?"},link:function(i,t,a,o,d){function l(){e.forEach(c,function(e){if(i.control[e])throw new Error("The `"+e+"` method can not be overwritten")})}d(i.$parent.$new(),function(e,n){n.$accordion=i.internalControl,t.append(e)});var c=["toggle","expand","collapse","expandAll","collapseAll","hasExpandedPane"];if(e.isDefined(i.allowMultiple)||(i.allowMultiple=e.isDefined(a.multiple)),a.$set("role","tablist"),i.allowMultiple&&a.$set("aria-multiselectable","true"),e.isDefined(i.control)){l();var r=e.extend({},i.internalControl,i.control);i.control=i.internalControl=r}else i.control=i.internalControl;n(function(){var n=e.isDefined(o.getAccordionId())?o.getAccordionId()+":onReady":"vAccordion:onReady";i.$emit(n)},0)}}}function i(n){var i=this,t=!1;n.panes=[],n.expandCb=e.isFunction(n.expandCb)?n.expandCb:e.noop,n.collapseCb=e.isFunction(n.collapseCb)?n.collapseCb:e.noop,i.hasExpandedPane=function(){for(var e=!1,i=0,t=n.panes.length;t>i;i++){var a=n.panes[i];if(a.isExpanded){e=!0;break}}return e},i.getPaneByIndex=function(i){var t;return e.forEach(n.panes,function(n){n.$parent&&e.isDefined(n.$parent.$index)&&n.$parent.$index===i&&(t=n)}),t?t:n.panes[i]},i.getPaneIndex=function(i){var t;return e.forEach(n.panes,function(n){n.$parent&&e.isDefined(n.$parent.$index)&&n===i&&(t=n.$parent.$index)}),e.isDefined(t)?t:n.panes.indexOf(i)},i.getPaneById=function(i){var t;return e.forEach(n.panes,function(e){e.id&&e.id===i&&(t=e)}),t},i.getPaneId=function(e){return e.id},i.getAccordionId=function(){return n.id},i.disable=function(){t=!0},i.enable=function(){t=!1},i.addPane=function(e){if(!n.allowMultiple&&i.hasExpandedPane()&&e.isExpanded)throw new Error("The `multiple` attribute can't be found");n.panes.push(e),e.isExpanded&&n.expandCb({index:i.getPaneIndex(e),id:e.id,pane:e})},i.focusNext=function(){for(var e=n.panes.length,i=0;e>i;i++){var t=n.panes[i];if(t.isFocused){var a=i+1;a>n.panes.length-1&&(a=0);var o=n.panes[a];o.paneElement.find("v-pane-header")[0].focus();break}}},i.focusPrevious=function(){for(var e=n.panes.length,i=0;e>i;i++){var t=n.panes[i];if(t.isFocused){var a=i-1;0>a&&(a=n.panes.length-1);var o=n.panes[a];o.paneElement.find("v-pane-header")[0].focus();break}}},i.toggle=function(e){!t&&e&&(n.allowMultiple||i.collapseAll(e),e.isExpanded=!e.isExpanded,e.isExpanded?n.expandCb({index:i.getPaneIndex(e),id:e.id,pane:e}):n.collapseCb({index:i.getPaneIndex(e),id:e.id,pane:e}))},i.expand=function(e){!t&&e&&(n.allowMultiple||i.collapseAll(e),e.isExpanded||(e.isExpanded=!0,n.expandCb({index:i.getPaneIndex(e),id:e.id,pane:e})))},i.collapse=function(e){!t&&e&&e.isExpanded&&(e.isExpanded=!1,n.collapseCb({index:i.getPaneIndex(e),id:e.id,pane:e}))},i.expandAll=function(){if(!t){if(!n.allowMultiple)throw new Error("The `multiple` attribute can't be found");e.forEach(n.panes,function(e){i.expand(e)})}},i.collapseAll=function(a){t||e.forEach(n.panes,function(e){e!==a&&i.collapse(e)})},n.internalControl={toggle:function(n){e.isString(n)?i.toggle(i.getPaneById(n)):i.toggle(i.getPaneByIndex(n))},expand:function(n){e.isString(n)?i.expand(i.getPaneById(n)):i.expand(i.getPaneByIndex(n))},collapse:function(n){e.isString(n)?i.collapse(i.getPaneById(n)):i.collapse(i.getPaneByIndex(n))},expandAll:i.expandAll,collapseAll:i.collapseAll,hasExpandedPane:i.hasExpandedPane}}function t(){return{restrict:"E",require:"^vPane",transclude:!0,template:"<div ng-transclude></div>",scope:{},link:function(e,n,i){i.$set("role","tabpanel")}}}function a(){return{restrict:"E",require:["^vPane","^vAccordion"],transclude:!0,template:"<div ng-transclude></div>",scope:{},link:function(n,i,t,a){function o(){return r?!1:(n.$apply(function(){l.toggle()}),void 0)}function d(e){32===e.keyCode||13===e.keyCode?(n.$apply(function(){l.toggle()}),e.preventDefault()):39===e.keyCode?(n.$apply(function(){c.focusNext()}),e.preventDefault()):37===e.keyCode&&(n.$apply(function(){c.focusPrevious()}),e.preventDefault())}t.$set("role","tab");var l=a[0],c=a[1],r=e.isDefined(t.inactive);i[0].onfocus=function(){l.focusPane()},i[0].onblur=function(){l.blurPane()},i.bind("click",o),i.bind("keydown",d),n.$on("$destroy",function(){i.unbind("click",o),i.unbind("keydown",d),i[0].onfocus=null,i[0].onblur=null})}}}function o(n,i,t){return{restrict:"E",require:"^vAccordion",transclude:!0,controller:d,scope:{isExpanded:"=?expanded",isDisabled:"=?ngDisabled",id:"@?"},link:function(a,o,d,l,c){function r(n){n=e.isDefined(g)?g+":"+n:"vAccordion:"+n,a.$emit(n)}function s(){l.disable(),x[0].style.maxHeight="0px",f.attr({"aria-selected":"true",tabindex:"0"}),r("onExpand"),n(function(){i.addClass(o,u.expanded).then(function(){l.enable(),x[0].style.maxHeight="none",r("onExpandAnimationEnd")}),setTimeout(function(){x[0].style.maxHeight=v[0].offsetHeight+"px"},0)},0)}function p(){l.disable(),x[0].style.maxHeight=v[0].offsetHeight+"px",f.attr({"aria-selected":"false",tabindex:"-1"}),r("onCollapse"),n(function(){i.removeClass(o,u.expanded).then(function(){l.enable(),r("onCollapseAnimationEnd")}),setTimeout(function(){x[0].style.maxHeight="0px"},0)},0)}c(a.$parent.$new(),function(e,n){n.$pane=a.internalControl,a.id&&(n.$pane.id=a.id),o.append(e)}),e.isDefined(a.isExpanded)||(a.isExpanded=e.isDefined(d.expanded)),e.isDefined(d.disabled)&&(a.isDisabled=!0);var u=t.states,f=o.find("v-pane-header"),x=o.find("v-pane-content"),v=x.find("div"),g=l.getAccordionId();if(!f[0])throw new Error("The `v-pane-header` directive can't be found");if(!x[0])throw new Error("The `v-pane-content` directive can't be found");a.paneElement=o,a.paneContentElement=x,a.paneInnerElement=v,a.accordionCtrl=l,l.addPane(a),a.isExpanded?(o.addClass(u.expanded),x[0].style.maxHeight="none",f.attr({"aria-selected":"true",tabindex:"0"})):(x[0].style.maxHeight="0px",f.attr({"aria-selected":"false",tabindex:"-1"})),a.$watch("isExpanded",function(e,n){return e===n?!0:(e?s():p(),void 0)})}}}function d(e){var n=this;n.isExpanded=function(){return e.isExpanded},n.toggle=function(){e.isAnimating||e.isDisabled||e.accordionCtrl.toggle(e)},n.expand=function(){e.isAnimating||e.isDisabled||e.accordionCtrl.expand(e)},n.collapse=function(){e.isAnimating||e.isDisabled||e.accordionCtrl.collapse(e)},n.focusPane=function(){e.isFocused=!0},n.blurPane=function(){e.isFocused=!1},e.internalControl={toggle:n.toggle,expand:n.expand,collapse:n.collapse,isExpanded:n.isExpanded}}e.module("vAccordion.config",[]).constant("accordionConfig",{states:{expanded:"is-expanded"}}),e.module("vAccordion.directives",[]),e.module("vAccordion",["vAccordion.config","vAccordion.directives"]),e.module("vAccordion.directives").directive("vAccordion",n),n.$inject=["$timeout"],i.$inject=["$scope"],e.module("vAccordion.directives").directive("vPaneContent",t),e.module("vAccordion.directives").directive("vPaneHeader",a),e.module("vAccordion.directives").directive("vPane",o),o.$inject=["$timeout","$animate","accordionConfig"],d.$inject=["$scope"]}(angular);