/* PushMenu()

 * ==========

 * Adds the push menu functionality to the sidebar.

 *

 * @usage: $('.btn').pushMenu(options)

 *          or add [data-toggle="push-menu"] to any button

 *          Pass any option as data-option="value"

 */

+function ($) {

  'use strict';



  var DataKey = 'lte.pushmenu';



  var Default = {

    collapseScreenSize   : 767,

    expandOnHover        : false,

    expandTransitionDelay: 200

  };



  var Selector = {

    collapsed     : '.sidebar-collapse',

    open          : '.sidebar-open',

    mainSidebar   : '.main-sidebar',

    contentWrapper: '.content-wrapper',

    searchInput   : '.sidebar-form .form-control',

    button        : '[data-toggle="push-menu"]',

    mini          : '.sidebar-mini',

    expanded      : '.sidebar-expanded-on-hover',

    layoutFixed   : '.fixed'

  };



  var ClassName = {

    collapsed    : 'sidebar-collapse',

    open         : 'sidebar-open',

    mini         : 'sidebar-mini',

    expanded     : 'sidebar-expanded-on-hover',

    expandFeature: 'sidebar-mini-expand-feature',

    layoutFixed  : 'fixed'

  };



  var Event = {

    expanded : 'expanded.pushMenu',

    collapsed: 'collapsed.pushMenu'

  };



  // PushMenu Class Definition

  // =========================

  var PushMenu = function (options) {

    this.options = options;

    this.init();

  };



  PushMenu.prototype.init = function () {

    if (this.options.expandOnHover

      || ($('body').is(Selector.mini + Selector.layoutFixed))) {

      this.expandOnHover();

      $('body').addClass(ClassName.expandFeature);

    }



    $(Selector.contentWrapper).click(function () {

      // Enable hide menu when clicking on the content-wrapper on small screens

      if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) {

        this.close();

      }

    }.bind(this));



    // __Fix for android devices

    $(Selector.searchInput).click(function (e) {

      e.stopPropagation();

    });

  };



  PushMenu.prototype.toggle = function () {

    var windowWidth = $(window).width();

    var isOpen      = !$('body').hasClass(ClassName.collapsed);



    if (windowWidth <= this.options.collapseScreenSize) {

      isOpen = $('body').hasClass(ClassName.open);

    }



    if (!isOpen) {

      this.open();

    } else {

      this.close();

    }

  };



  PushMenu.prototype.open = function () {

    var windowWidth = $(window).width();



    if (windowWidth > this.options.collapseScreenSize) {

      $('body').removeClass(ClassName.collapsed)

        .trigger($.Event(Event.expanded));

    }

    else {

      $('body').addClass(ClassName.open)

        .trigger($.Event(Event.expanded));

    }

  };



  PushMenu.prototype.close = function () {

    var windowWidth = $(window).width();

    if (windowWidth > this.options.collapseScreenSize) {

      $('body').addClass(ClassName.collapsed)

        .trigger($.Event(Event.collapsed));

    } else {

      $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed)

        .trigger($.Event(Event.collapsed));

    }

  };



  PushMenu.prototype.expandOnHover = function () {

    $(Selector.mainSidebar).hover(function () {

      if ($('body').is(Selector.mini + Selector.collapsed)

        && $(window).width() > this.options.collapseScreenSize) {

        this.expand();

      }

    }.bind(this), function () {

      if ($('body').is(Selector.expanded)) {

        this.collapse();

      }

    }.bind(this));

  };



  PushMenu.prototype.expand = function () {

    setTimeout(function () {

      $('body').removeClass(ClassName.collapsed)

        .addClass(ClassName.expanded);

    }, this.options.expandTransitionDelay);

  };



  PushMenu.prototype.collapse = function () {

    setTimeout(function () {

      $('body').removeClass(ClassName.expanded)

        .addClass(ClassName.collapsed);

    }, this.options.expandTransitionDelay);

  };



  // PushMenu Plugin Definition

  // ==========================

  function Plugin(option) {

    return this.each(function () {

      var $this = $(this);

      var data  = $this.data(DataKey);



      if (!data) {

        var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);

        $this.data(DataKey, (data = new PushMenu(options)));

      }



      if (option === 'toggle') data.toggle();

    });

  }



  var old = $.fn.pushMenu;



  $.fn.pushMenu             = Plugin;

  $.fn.pushMenu.Constructor = PushMenu;



  // No Conflict Mode

  // ================

  $.fn.pushMenu.noConflict = function () {

    $.fn.pushMenu = old;

    return this;

  };



  // Data API

  // ========

  $(document).on('click', Selector.button, function (e) {

    e.preventDefault();

    Plugin.call($(this), 'toggle');

  });

  $(window).on('load', function () {

    Plugin.call($(Selector.button));

  });

}(jQuery);

