Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / foundation / foundation.dropdown.js @ f0ac40a4

History | View | Annotate | Download (3.4 kB)

1 b3c1328b Olga Brani
/*jslint unparam: true, browser: true, indent: 2 */
2 b3c1328b Olga Brani
3 b3c1328b Olga Brani
;(function ($, window, document, undefined) {
4 b3c1328b Olga Brani
  'use strict';
5 b3c1328b Olga Brani
6 b3c1328b Olga Brani
  Foundation.libs.dropdown = {
7 b3c1328b Olga Brani
    name : 'dropdown',
8 b3c1328b Olga Brani
9 b3c1328b Olga Brani
    version : '4.0.9',
10 b3c1328b Olga Brani
11 b3c1328b Olga Brani
    settings : {
12 b3c1328b Olga Brani
      activeClass: 'open'
13 b3c1328b Olga Brani
    },
14 b3c1328b Olga Brani
15 b3c1328b Olga Brani
    init : function (scope, method, options) {
16 b3c1328b Olga Brani
      this.scope = scope || this.scope;
17 b3c1328b Olga Brani
      Foundation.inherit(this, 'throttle');
18 b3c1328b Olga Brani
19 b3c1328b Olga Brani
      if (typeof method === 'object') {
20 b3c1328b Olga Brani
        $.extend(true, this.settings, method);
21 b3c1328b Olga Brani
      }
22 b3c1328b Olga Brani
23 b3c1328b Olga Brani
      if (typeof method != 'string') {
24 b3c1328b Olga Brani
25 b3c1328b Olga Brani
        if (!this.settings.init) {
26 b3c1328b Olga Brani
          this.events();
27 b3c1328b Olga Brani
        }
28 b3c1328b Olga Brani
29 b3c1328b Olga Brani
        return this.settings.init;
30 b3c1328b Olga Brani
      } else {
31 b3c1328b Olga Brani
        return this[method].call(this, options);
32 b3c1328b Olga Brani
      }
33 b3c1328b Olga Brani
    },
34 b3c1328b Olga Brani
35 b3c1328b Olga Brani
    events : function () {
36 b3c1328b Olga Brani
      var self = this;
37 b3c1328b Olga Brani
38 b3c1328b Olga Brani
      $(this.scope).on('click.fndtn.dropdown', '[data-dropdown]', function (e) {
39 b3c1328b Olga Brani
        e.preventDefault();
40 b3c1328b Olga Brani
        e.stopPropagation();
41 b3c1328b Olga Brani
        self.toggle($(this));
42 b3c1328b Olga Brani
      });
43 b3c1328b Olga Brani
44 b3c1328b Olga Brani
      $('*, html, body').on('click.fndtn.dropdown', function (e) {
45 b3c1328b Olga Brani
        if (!$(e.target).data('dropdown')) {
46 b3c1328b Olga Brani
          $('[data-dropdown-content]')
47 b3c1328b Olga Brani
            .css('left', '-99999px')
48 b3c1328b Olga Brani
            .removeClass(self.settings.activeClass);
49 b3c1328b Olga Brani
        }
50 b3c1328b Olga Brani
      });
51 b3c1328b Olga Brani
52 b3c1328b Olga Brani
      $(window).on('resize.fndtn.dropdown', self.throttle(function () {
53 b3c1328b Olga Brani
        self.resize.call(self);
54 b3c1328b Olga Brani
      }, 50)).trigger('resize');
55 b3c1328b Olga Brani
56 b3c1328b Olga Brani
      this.settings.init = true;
57 b3c1328b Olga Brani
    },
58 b3c1328b Olga Brani
59 b3c1328b Olga Brani
    toggle : function (target, resize) {
60 b3c1328b Olga Brani
      var dropdown = $('#' + target.data('dropdown'));
61 b3c1328b Olga Brani
62 b3c1328b Olga Brani
      $('[data-dropdown-content]').not(dropdown).css('left', '-99999px').removeClass(this.settings.activeClass);
63 b3c1328b Olga Brani
64 b3c1328b Olga Brani
      if (dropdown.hasClass(this.settings.activeClass)) {
65 b3c1328b Olga Brani
        dropdown
66 b3c1328b Olga Brani
          .css('left', '-99999px')
67 b3c1328b Olga Brani
          .removeClass(this.settings.activeClass);
68 b3c1328b Olga Brani
      } else {
69 b3c1328b Olga Brani
        this
70 b3c1328b Olga Brani
          .css(dropdown
71 b3c1328b Olga Brani
            .addClass(this.settings.activeClass), target);
72 b3c1328b Olga Brani
      }
73 b3c1328b Olga Brani
    },
74 b3c1328b Olga Brani
75 b3c1328b Olga Brani
    resize : function () {
76 b3c1328b Olga Brani
      var dropdown = $('[data-dropdown-content].open'),
77 b3c1328b Olga Brani
          target = $("[data-dropdown='" + dropdown.attr('id') + "']");
78 b3c1328b Olga Brani
79 b3c1328b Olga Brani
      if (dropdown.length && target.length) {
80 b3c1328b Olga Brani
        this.css(dropdown, target);
81 b3c1328b Olga Brani
      }
82 b3c1328b Olga Brani
    },
83 b3c1328b Olga Brani
84 b3c1328b Olga Brani
    css : function (dropdown, target) {
85 b3c1328b Olga Brani
      if (dropdown.parent()[0] === $('body')[0]) {
86 b3c1328b Olga Brani
        var position = target.offset();
87 b3c1328b Olga Brani
      } else {
88 b3c1328b Olga Brani
        var position = target.position();
89 b3c1328b Olga Brani
      }
90 b3c1328b Olga Brani
91 b3c1328b Olga Brani
      if (this.small()) {
92 b3c1328b Olga Brani
        dropdown.css({
93 b3c1328b Olga Brani
          position : 'absolute',
94 b3c1328b Olga Brani
          width: '95%',
95 b3c1328b Olga Brani
          left: '2.5%',
96 b3c1328b Olga Brani
          'max-width': 'none',
97 b3c1328b Olga Brani
          top: position.top + this.outerHeight(target)
98 b3c1328b Olga Brani
        });
99 b3c1328b Olga Brani
      } else {
100 b3c1328b Olga Brani
        if ($(window).width() > this.outerWidth(dropdown) + target.offset().left) {
101 b3c1328b Olga Brani
          var left = position.left;
102 b3c1328b Olga Brani
        } else {
103 b3c1328b Olga Brani
          if (!dropdown.hasClass('right')) {
104 b3c1328b Olga Brani
            dropdown.addClass('right');
105 b3c1328b Olga Brani
          }
106 b3c1328b Olga Brani
          var left = position.left - (this.outerWidth(dropdown) - this.outerWidth(target));
107 b3c1328b Olga Brani
        }
108 b3c1328b Olga Brani
        dropdown.attr('style', '').css({
109 b3c1328b Olga Brani
          position : 'absolute',
110 b3c1328b Olga Brani
          top: position.top + this.outerHeight(target),
111 b3c1328b Olga Brani
          left: left
112 b3c1328b Olga Brani
        });
113 b3c1328b Olga Brani
      }
114 b3c1328b Olga Brani
115 b3c1328b Olga Brani
      return dropdown;
116 b3c1328b Olga Brani
    },
117 b3c1328b Olga Brani
118 b3c1328b Olga Brani
    small : function () {
119 b3c1328b Olga Brani
      return $(window).width() < 768 || $('html').hasClass('lt-ie9');
120 b3c1328b Olga Brani
    },
121 b3c1328b Olga Brani
122 b3c1328b Olga Brani
    off: function () {
123 b3c1328b Olga Brani
      $(this.scope).off('.fndtn.dropdown');
124 b3c1328b Olga Brani
      $('html, body').off('.fndtn.dropdown');
125 b3c1328b Olga Brani
      $(window).off('.fndtn.dropdown');
126 b3c1328b Olga Brani
      $('[data-dropdown-content]').off('.fndtn.dropdown');
127 b3c1328b Olga Brani
      this.settings.init = false;
128 b3c1328b Olga Brani
    }
129 b3c1328b Olga Brani
  };
130 b3c1328b Olga Brani
}(Foundation.zj, this, this.document));