(function (window, document, $, undefined) { 'use strict'; var SlideBox = (function () { /** * @param $element * * @constructor */ function SlideBox($element) { this._$element = $element; } SlideBox.prototype.$content = function () { return this._$element.find('[data-st-slidebox-content]'); }; SlideBox.prototype.$toggle = function () { return this._$element.find('[data-st-slidebox-toggle]'); }; SlideBox.prototype.$icon = function () { return this._$element.find('[data-st-slidebox-icon]'); }; SlideBox.prototype.$text = function () { return this._$element.find('[data-st-slidebox-text]'); }; SlideBox.prototype.is_expanded = function () { return !!(this._$element.filter('[data-st-slidebox-expanded="true"]').length); }; SlideBox.prototype.expand = function () { var self = this; this.$content().slideDown() .promise() .then(function () { var $icon = self.$icon(); var $text = self.$text(); $icon.removeClass($icon.attr('data-st-slidebox-icon-collapsed')) .addClass($icon.attr('data-st-slidebox-icon-expanded')) $text.text($text.attr('data-st-slidebox-text-expanded')) self._$element.removeClass('is-collapsed') .addClass('is-expanded'); self._$element.attr('data-st-slidebox-expanded', 'true'); }); }; SlideBox.prototype.collapse = function () { var self = this; this.$content().slideUp() .promise() .then(function () { var $icon = self.$icon(); var $text = self.$text(); $icon.removeClass($icon.attr('data-st-slidebox-icon-expanded')) .addClass($icon.attr('data-st-slidebox-icon-collapsed')) $text.text($text.attr('data-st-slidebox-text-collapsed')) self._$element.removeClass('is-expanded') .addClass('is-collapsed'); self._$element.attr('data-st-slidebox-expanded', 'false'); }); }; SlideBox.prototype.toggle = function () { if (this.is_expanded()) { this.collapse(); } else { this.expand(); } }; SlideBox.prototype.add_event_listeners = function () { var self = this; this.$toggle().on('click', function (event) { self.toggle(); }); }; SlideBox.prototype.initialize = function () { this.add_event_listeners(); }; return SlideBox; }()); function on_ready() { var slideBoxes = []; $('[data-st-slidebox]').each(function () { var $element = $(this); var slideBox = new SlideBox($element); slideBoxes.push(slideBox); slideBox.initialize(); }); return slideBoxes; } $(on_ready); }(window, window.document, jQuery));