// source --> https://maternity.hu/wp-content/plugins/team-grid/assets/public/js/team-grid.js?ver=1.3.2 
window.TeamGrid = (function ($, window, document, undefined) {
  'use strict';
  var app = {
    debug: false,
    callbacks: [],
    displayers: {
      POPUP: 'popup',
      INLINE: 'inline',
      SLIDE_IN_LEFT: 'slide-in-left',
      SLIDE_IN_RIGHT: 'slide-in-right',
      MEMBER_LINK: 'member-link',
    },
  };

  //Document Ready
  $(function (event) {
    app.debug = TGR_PUBLIC_JS.debug_mode === 'on';

    $('.tgr-team:not(.tgr-design):not(.tgr-filter-design)').each(function (index, tgr_team) {
      var id = $(tgr_team).data('id');
      if( TGR_TEAMS[id] ){
        $(tgr_team).TeamGrid(TGR_TEAMS[id]);
      }
    });

    $('body').on('click', '.tgr-overlay, .tgr-close', function (event) {
      var team_id = $(this).closest('.tgr-wrap').data('id');
      var instance_id = $(this).closest('.tgr-displayer').data('instance-id');
      var instance = app.get_instance(team_id, instance_id);
      if( instance ){
        instance.close_popup();
      }
    });
    $('body').on('click', '.tgr-arrow', function (event) {
      var team_id = $(this).closest('.tgr-wrap').data('id');
      var instance_id = $(this).closest('.tgr-displayer').data('instance-id');
      var instance = app.get_instance(team_id, instance_id);
      if( instance ){
        instance.on_click_arrows_popup(event);
      }
    });

  });//document ready

  function TeamGrid(element, options) {
    var _ = this;
    _.$body = $('body');
    _.$team = $(element);

    _.defaults = {
      id: 0,
      title: '',
      showTitle: false,
      teamDescription: '',
      refresh: false,
      loadUsingAjax: false,
      isDesign: false,
      isFilterDesign: false,
      members: [],
      className: '',
      responsiveBy: 'window',//false
      bgColor: 'rgba(255, 255, 255, 0)',
      font: {
        heading1: 'Roboto',
        heading2: 'Lato',
        content: 'Open Sans',
      },

      layout: {
        number: 1,
        type: 'grid',//grid, list, table
        columns: 4,
        columnsMobile: 1,//1,2
        columnsGap: 15,
        truncateDescription: -1,

        hideImage: false,
        imageZoomScale: 1.2,
        imageZoomDuration: 0.5,
        imageZoomEffect: 'ease-out',

        textSize: 16,
        textSizeHeading1: 19,
        textSizeHeading2: 17,
        textColor: 'rgba(255, 255, 255, 1)',
        textColor2: 'rgba(255, 255, 255, 1)',
        linkColor: 'rgba(0, 0, 0, 1)',
        bgColor: 'rgba(0, 0, 0, 0.8)',
        bgGradientEnabled: false,
        bgGradientColor: 'rgba(0, 0, 0, 1)',
        bgGradientAngle: '180deg',
        bgColor2: 'rgba(0, 0, 0, 0.8)',
        bgGradientEnabled2: false,
        bgGradientColor2: 'rgba(0, 0, 0, 1)',
        bgGradientAngle2: '180deg',
        borderWidth: 0,
        borderColor: 'rgba(0, 0, 0, 0.2)',
        borderDifferentHover: false,
        borderWidth2: 0,
        borderColor2: 'rgba(0, 0, 0, 0.2)',
        equalHeights: true,

        grid: {
          headings: {
            visible: true
          },
          socialIcons: {
            visible: false,
            //visibleOnHover: true,//It will always be visible in hover
          },
          description: {
            visible: false,
            visibleOnHover: true,
          },
        },
        list: {
          isRight: false,
          borderBottomOnly: true,
        },
        table: {
          bordered: false,
          striped: false,
          hover: false,
          stripedColor: 'rgba(0, 0, 0, 0.03)',
          hoverColor: 'rgba(0, 0, 0, 0.04)',
          columns: ['image', 'name', 'role', 'description', 'social']
        }
      },
      social: {
        iconsColor: 'rgba(51, 51, 51, 1)',
        iconsColorHover: 'rgba(0, 0, 0, 1)',
        iconsBorderRadius: 50,
      },
      skills: {
        bgColor: 'rgba(0, 0, 0, 0.2)',
        bgPercent: 'rgba(0, 0, 0, 0.7)',
        showPercent: true,
      },
      filters: {
        show: true,
        selected: [],
        sort: 'none',
        hideAll: false,
        multipleChoice: false,
        showFilterCount: false,
        inEffect: 'tgr-zoomIn',
        outEffect: 'tgr-zoomOut',
        duration: 400,
        dropdown: false,

        gap: 10,
        fontFamily: 'Roboto Condensed',
        uppercaseText: true,
        textSize: 16,
        textColor: 'rgba(76, 76, 76, 1)',
        borderWidth: 0,
        borderColor: 'rgba(0, 0, 0, 0)',
        bgColor: 'rgba(255, 255, 255, 0)',
        borderRadius: 0,
        padding: '12px 24px',
        bgGradientEnabled: false,
        bgGradientColor: 'rgba(0, 0, 0, 1)',
        bgGradientAngle: '135deg',

        textColorActive: 'rgba(0, 0, 0, 1)',
        borderWidthActive: 3,
        borderColorActive: 'rgba(252,1,41,1)',
        borderBottomOnlyActive: true,
        bgColorActive: 'rgba(255, 255, 255, 0)',
        bgGradientEnabledActive: false,
        bgGradientColorActive: 'rgba(0, 0, 0, 1)',
        bgGradientAngleActive: '135deg',

        textColorHover: 'rgba(0, 0, 0, 1)',
        borderColorHover: 'rgba(252,1,41,1)',
        bgColorHover: 'rgba(255, 255, 255, 0)',
        bgGradientEnabledHover: false,
        bgGradientColorHover: 'rgba(0, 0, 0, 1)',
        bgGradientAngleHover: '135deg',
      },
      member: {
        titleTag: "h3",
        roleTag: "h4",
        titleAfterRole: false
      },

      displayer: {
        type: 'popup',//none, popup, inline, slide-in-left, slide-in-right
        autoScroll: true,
        textSize: 16,
        textSizeHeading1: 19,
        textSizeHeading2: 17,
        textColor: 'rgba(68, 68, 68, 1)',
        linkColor: 'rgba(0, 0, 0, 1)',
        bgColor: 'rgba(255, 255, 255, 1)',
        borderWidth: 1,
        borderColor: 'rgba(0, 0, 0, 0.3)',
        triangleColor: 'rgba(0, 0, 0, 0.6)',
        controlsColor: 'rgba(102, 102, 102, 1)',
        verticalPadding: 36,
        horizontalPadding: 40,
        targetLink: '_blank',

        inline: {
          height: 460,
          marginTop: 20,
        },
        slide: {
          width: 480,
        },
        popup: {
          width: 880,//880px, Slide In 100%
          height: 540,//460px, Slide In 100%
          borderRadius: 0,
          nextItemEffect: 'fade',//slide, fade
          disablePageScroll: true,
          open: {
            delay: 0,
            duration: 800,
            animation: 'tgr-zoomIn',//tgr-zoomIn, tgr-slideInLeft, tgr-slideInRight
          },
          close: {
            delay: 0,
            duration: 700,
            animation: 'tgr-zoomOut',
            icon: 'default'//default, circular
          },
          overlay: {
            show: true,
            durationIn: 300,
            durationOut: 250,
          },
          arrows: {
            icon: 'default',//default, circular
          },
        },
      },
      breakpoints: {
        extraLarge: 1560,
        large: 1280,
        laptop: 1024,
        tablet: 834,
        mobile: 768,
      },

      callbacks: {
        beforeOpen: function ($, box_instance, team_id, options) {
        },
        resize: function ($, box_instance, team_id, options) {
        },
      },
    };

    _.init(options);

    return this;
  }

  TeamGrid.prototype = {
    init: function (options) {
      var _ = this;

      _.options = _.update_options(options);

      if(_.options.loadUsingAjax){
        _.load_team_using_ajax();
      } else {
        _.initialize();
      }
    },

    initialize: function(){
      var _ = this;
      clog("== Plugin Final Options (after update_options)", _.options);
      _.init_variables();

      if (_.options.refresh) {
        _.refresh();
      }

      if (_.options.filters.show || _.options.isFilterDesign ) {
        _.fill_filters();
        _.build_filter();
      }

      _.create_initial_elements();

      _.set_initial_styles();
      _.set_dynamic_styles();

      //Register all events
      _.events();

      //Show box
      _.$box.fadeTo(100, 1);
    },

    load_team_using_ajax: function(){
      var _ = this;
      var data = {
        team_id: _.options.id,
        action: 'tgr_load_team',
      };
      app.ajax({
        data: data,
        dataType: 'html',
        beforeSend: function () {
        },
        success: function(response){
          if(response.indexOf('error:') === 0){
            _.$team.find('.tgr-box-inner').text(response.split(':')[1]);
            _.$team.find('.tgr-box').css('opacity', 1);
          } else {
            _.$team.find('.tgr-box-inner').html(response);
            _.initialize();
          }
        },
        error: function(response){
        },
        complete: function (jqXHR, textStatus) {
        }
      });
    },

    update_options: function (options) {
      var _ = this;
      _.metadata = _.$team.data('options') || {};
      if( options.refresh || options.isDesign || options.isFilterDesign ){
        _.options = $.extend(true, {}, _.defaults, options);
      } else {
        _.options = $.extend(true, {}, _.defaults, options, _.metadata);
      }

      //Valid columns values. Min: 2, Max 6
      var columns = _.options.layout.columns;
      _.options.layout.columns = columns >= 2 && columns <= 6 ? columns : 4;
      return _.options;
    },

    init_variables: function () {
      var _ = this;
      clog("init_variables refresh", _.options.refresh);
      _.set_team_id();
      _.instance_id = Math.floor(1000 + Math.random() * 9000);
      _.$box_wrap = _.$team.find('.tgr-box-wrapper');
      _.$filter = _.$box_wrap.find('.tgr-filter');
      _.$box = _.$box_wrap.find('.tgr-box');
      _.$box_inner = _.$box.find('.tgr-box-inner');
      _.$items = _.$box_inner.find('.tgr-item');
      _.metadata = {};

      //Filters
      _.filters = {
        separate: true,
        all: [],
        count: {},
        names: {},
      };
      _.clearSelectedFilters = false;
      _.selected_filters = [];

      //Viewer Inline
      _.$inline = $();

      //Viewer Popup
      _.$popup = $();
      _.$overlay = $();
      _.popup_is_open = false;
      _.is_opening_popup = false;
      _.popup_is_closing = false;

      //Styles
      _.styles = [];
    },

    set_team_id: function () {
      var _ = this;
      var team_id = _.options.id || _.$team.data('id');
      _.options.id = team_id;
      _.team_id = team_id;
    },

    create_initial_elements: function () {
      var _ = this;

      //Team ID, Class
      _.$team.addClass('tgr-team-'+_.team_id).addClass(_.options.className);
      _.$team.attr('data-instance-id', _.instance_id);

      if(_.options.showTitle && _.options.title ){
        var $title = $('<h2 class="tgr-team-title">'+_.options.title+'</h2>');
        var $description = $('<p class="tgr-team-description">'+_.options.teamDescription+'</p>');
        _.$team.prepend($description);
        _.$team.prepend($title);
      }
    },

    refresh: function () {
      var _ = this;
      _.destroy();
      _.build_wrap();
      _.init_variables();
      _.build_items();
    },

    destroy: function () {
      var _ = this;
      _.$team.html('');
    },

    build_wrap: function () {
      var _ = this;
      var html = '';
      html += '<div class="' + _.get_box_wrapper_class() + '">';
      html += '<div class="tgr-box">';
      html += '<div class="'+_.get_box_inner_class()+'">';
      html += '</div><!--.tgr-box-inner-->';
      html += '</div><!--.tgr-box-->';
      html += '</div><!--.tgr-box-wrapper-->';

      _.$team.html(html);
    },

    get_box_wrapper_class: function () {
      var _ = this;
      var box_wrapper_class = ['tgr-box-wrapper'];
      box_wrapper_class.push('tgr-anim-zoom-images');
      box_wrapper_class.push('tgr-displayer-' + _.options.displayer.type);
      box_wrapper_class.push('tgr-layout-' + _.options.layout.number);
      box_wrapper_class.push('tgr-layout-type-' + _.options.layout.type);
      if( _.options.layout.hideImage ){
        box_wrapper_class.push('tgr-hide-image');
      }
      return box_wrapper_class.join(' ');
    },

    get_box_inner_class: function () {
      var _ = this;
      var box_inner_class = ['tgr-box-inner'];
      if( !_.is_layout_table() && !_.is_layout_list() ){
        box_inner_class.push('tgr-grid');
        box_inner_class.push('tgr-grid-' + _.options.layout.columns + '-col');
        if(_.options.layout.columnsMobile == 2){
          box_inner_class.push('tgr-mobile-2-columns');
        }
      }
      return box_inner_class.join(' ');
    },

    build_items: function () {
      var _ = this;

      if (!_.options.refresh || !app.isArray(_.options.members)) {
        return;
      }
      var html = '';

      if (_.is_layout_table()) {//table layout
        html += _.build_items_table();
      } else {
        html += _.build_items_default();
      }

      //Agregamos items
      _.$box_inner.html(html);
      _.$items = _.$box_inner.find('.tgr-item');
    },

    build_items_table: function () {
      var _ = this;
      var html = '';
      var index = -1;
      var tableClass = 'tgr-table';
      if (_.options.layout.table.bordered) {
        tableClass += ' tgr-table-bordered';
      }
      if (_.options.layout.table.striped) {
        tableClass += ' tgr-table-striped';
      }
      if (_.options.layout.table.hover) {
        tableClass += ' tgr-table-hover';
      }

      html = '<div class="' + tableClass + '">';
      html += '<div class="tgr-tr tgr-thead">';
      if( _.options.layout.table.columns.indexOf('image') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberImage + '</div>';
      }
      if( _.options.layout.table.columns.indexOf('name') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberName + '</div>';
      }
      if( _.options.layout.table.columns.indexOf('role') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberRole + '</div>';
      }
      if( _.options.layout.table.columns.indexOf('description') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberDescription + '</div>';
      }
      if( _.options.layout.table.columns.indexOf('social') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberSocialIcons + '</div>';
      }
      if( _.options.layout.table.columns.indexOf('fields') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberFields + '</div>';
      }
      if( _.options.layout.table.columns.indexOf('skills') > -1 ){
        html += '<div class="tgr-th">' + TGR_PUBLIC_JS.texts.memberSkills + '</div>';
      }

      html += '</div>';

      _.options.members.forEach(function (id, i) {
        var member = _.get_member_options(id);
        if (app.is_empty(member)) return true;//continue;
        index++;

        html += '<div class="tgr-tr tgr-item" data-filters="' + member.filters + '" data-id="' + member.id + '" data-index="' + index + '">';

        if( _.options.layout.table.columns.indexOf('image') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += '<div class="tgr-item-image">';
          html += _.get_item_image(member);
          html += '</div>';//.tgr-item-image
          html += '</div>';
        }

        if( _.options.layout.table.columns.indexOf('name') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += _.get_item_title(member);
          html += '</div>';
        }
        if( _.options.layout.table.columns.indexOf('role') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += _.get_item_subtitle(member);
          html += '</div>';
        }
        if( _.options.layout.table.columns.indexOf('description') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += _.get_item_description(member);
          html += '</div>';
        }
        if( _.options.layout.table.columns.indexOf('social') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += _.get_item_social(member);
          html += '</div>';
        }
        if( _.options.layout.table.columns.indexOf('fields') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += _.build_member_fields(member);
          html += '</div>';
        }
        if( _.options.layout.table.columns.indexOf('skills') > -1 ){
          html += '<div class="tgr-td tgr-item-inner">';
          html += _.build_member_skills(member);
          html += '</div>';
        }

        html += '</div>';//tgr-tr
      });
      html += '</div>';//table
      return html;
    },

    build_items_default: function () {
      var _ = this;
      var html = '';
      var index = -1;
      _.options.members.forEach(function (id, i) {
        var member = _.get_member_options(id);
        if (app.is_empty(member)) return true;//continue;
        index++;

        var itemClass = 'tgr-item';
        if (!_.is_layout_list()) {
          itemClass += ' tgr-grid-item';
        }

        html += '<div class="' + itemClass + '" data-filters="' + member.filters + '" data-id="' + member.id + '" data-index="' + index + '">';

        var itemInnerClass = 'tgr-item-inner tgr-animate-social-icons';
        if (_.is_layout_flip_card()) {
          itemInnerClass += ' tgr-flip-card-container';
        }
        html += '<div class="' + itemInnerClass + '">';
        if (_.is_layout_list()) {
          html += _.get_html_layout_list(id);
        } else {
          var figureClass = 'tgr-figure';
          if (_.is_layout_flip_card()) {
            figureClass += ' tgr-flip-card';
          }

          html += '<figure class="' + figureClass + '">';
          if (_.is_layout_flip_card()) {
            html += '<div class="tgr-flip-front">';
          }
          html += '<div class="tgr-item-image">';
          html += _.get_item_image(member);
          html += _.get_item_header(member);
          html += _.get_item_social(member);
          html += _.get_item_description(member);
          html += '</div>';//.tgr-item-image

          html += '<figcaption class="tgr-figcaption">';
          html += _.get_item_header(member);
          html += _.get_item_social(member);
          html += _.get_item_description(member);
          html += '</figcaption>';

          if (_.is_layout_flip_card()) {
            html += '</div>';
            html += '<div class="tgr-flip-back">';
            html += '<figcaption class="tgr-figcaption">';
            html += _.get_item_image(member);
            html += _.get_item_header(member);
            html += _.get_item_social(member);
            html += _.get_item_description(member);
            html += '</figcaption>';
            html += '</div>';
          }
          html += '</figure>';
        }
        html += '</div>';//.tgr-item-inner
        html += '</div>';//.tgr-item
      });
      return html;
    },

    get_item_image: function (member) {
      var html = '';
      if( ! this.options.layout.hideImage ){
        html += '<img class="tgr-img" src="' + member.image + '" alt="">';
      }
      return html;
    },
    get_item_title: function (member) {
      var html = '';
      html += '<div class="tgr-item-title">';
      html += '<' + this.options.member.titleTag + '>' + member.title + '</' + this.options.member.titleTag + '>';
      html += '</div>';
      return html;
    },
    get_item_subtitle: function (member) {
      var html = '';
      html += '<div class="tgr-item-subtitle">';
      html += '<' + this.options.member.roleTag + '>' + member.role + '</' + this.options.member.roleTag + '>';
      html += '</div>';
      return html;
    },
    get_item_header: function (member) {
      var _ = this;
      var html = '';
      html += '<div class="tgr-item-header">';
      if (_.options.member.titleAfterRole) {
        html += _.get_item_subtitle(member);
        html += _.get_item_title(member);
      } else {
        html += _.get_item_title(member);
        html += _.get_item_subtitle(member);
      }
      html += '</div>';
      return html;
    },
    get_item_description: function (member) {
      var html = '';
      html += '<div class="tgr-item-desc">';
      if( this.options.layout.truncateDescription == -1 ){
        html += member.description;
      } else if( this.options.layout.truncateDescription == 0 ){
        html += '';
      } else {
        html += app.truncateString(member.description, this.options.layout.truncateDescription);
      }
      html += '</div>';
      return html;
    },
    get_item_social: function (member) {
      var html = '';
      html += '<ul class="tgr-item-social">';
      member.social.forEach(function (link, i) {
        html += '<li><a href="' + link.url + '" target="_blank" class="tgr-item-link tgr-animation-bounce-in" title="'+link.title+'">';
        if (link.custom_icon) {
          html += link.custom_icon;
        } else {
          html += '<i class="' + link.icon + '"></i>';
        }
        html += '</a></li>';
      });
      html += '</ul>';
      return html;
    },

    get_total_items: function () {
      var _ = this;
      return _.$items.length;
    },

    fill_filters: function () {
      var _ = this;
      //Reset
      _.filters.all = [];
      _.filters.count = {};
      _.filters.names = {};

      var filters_arr = [];
      if( _.options.isFilterDesign && _.options.filters.testFilters ){
        filters_arr = _.options.filters.testFilters;
      } else {
        _.$items.each(function (index, item) {
          var item_filters = _.get_item_filters($(item));
          filters_arr = filters_arr.concat(item_filters);
        });
      }

      //Filter count
      filters_arr.forEach(function (filter, i) {
        _.filters.count[filter] = (_.filters.count[filter] || 0) + 1;
      });
      if( app.is_empty(_.options.filters.selected) ){
        for (var filter in _.filters.count) {
          _.filters.all.push(filter);
        }
      } else {
        _.filters.all = _.options.filters.selected;
      }


      //Filter names
      if( _.options.isFilterDesign || ! TGR_PUBLIC_JS.filters ){
        _.filters.all.forEach(function (filter, i) {
          _.filters.names[filter] = filter;
        });
      } else {
        _.filters.names = TGR_PUBLIC_JS.filters;
      }

      //Sort filters
      if( _.options.filters.sort == 'asc' ){
        _.filters.all.sort();
      } else if( _.options.filters.sort == 'desc' ){
        _.filters.all.sort(function(a,b){
          return b.localeCompare(a);
        });
      }
    },

    build_filter: function () {
      var _ = this;
      _.$team.prepend('<div class="tgr-filter-wrap"><div class="tgr-filter"></div></div>');
      _.$filter_wrap = _.$team.find('.tgr-filter-wrap');
      _.$filter = _.$team.find('.tgr-filter');

      if( _.options.filters.dropdown ){
        _.$filter_wrap.prepend('<div class="tgr-item-dropdown"><i class="tgr-icon tgr-icon-filter"></i></div>');
        _.$filter.closest('.tgr-filter-wrap').addClass('tgr-filter-dropdown');
        if( !_.options.filters.hideAll ){
          _.$filter_wrap.find('.tgr-item-dropdown').prepend('<span>Filters</span>');
        }
      }

      if( _.options.filters.gap >= 2 ){
        _.filters.separate = true;
        _.$filter.addClass('tgr-separate-filters');
      } else {
        _.filters.separate = false;
      }

      if( _.options.filters.borderBottomOnlyActive ){
        _.$filter.addClass('tgr-filter-border-bottom-only');
      }

      if( !_.options.filters.hideAll ){
        _.$filter.append('<div class="tgr-filter-item tgr-active-filter" data-filter-id="0"><span>' + TGR_PUBLIC_JS.texts.allMembers + '</span></div>');
      }


      if (_.options.filters.showFilterCount) {
        _.$filter.find('.tgr-filter-item').eq(0).append('<span class="tgr-filter-count">' + _.get_total_items() + '</span>');
      }
      _.filters.all.forEach(function(filter, index, arr){
        _.$filter.append('<div class="tgr-filter-item" data-filter-id="' + filter + '"><span>' + _.filters.names[filter] + '</span></div>');
        if (_.options.filters.multipleChoice) {
          _.$filter.find('.tgr-filter-item').eq(index+1).append('<span class="tgr-filter-checkbox"><i class="tgr-icon tgr-icon-check"></i></span>');
        }
        if (_.options.filters.showFilterCount) {
          var count = _.filters.count[filter] || 0;
          _.$filter.find('.tgr-filter-item').eq(index+1).append('<span class="tgr-filter-count">' + count + '</span>');
        }
      });
    },

    events: function () {
      var _ = this;

      _.events_filters();

      if(_.options.isFilterDesign){
        return;
      }

      _.events_displayer_popup();
      _.events_displayer_inline();

      var enableClickItem = false;
      if (!_.is_displayer_none()) {
        enableClickItem = true;
        if (_.is_layout_list()) {
          enableClickItem = false;
        }
        if (_.is_layout_table() && _.is_displayer_inline()) {
          enableClickItem = false;
        }
      }
      if (enableClickItem) {
        _.$box.find('.tgr-item-inner').on('click', function (event) {
          _.on_click_item(event, $(this));
        });
      }
    },

    events_filters: function (e) {
      var _ = this;
      _.$filter.find('.tgr-filter-item').on('click', function (event) {
        _.on_click_filter_item(event, $(this));
        var $filterWrap = $(this).closest('.tgr-filter-dropdown');
        if($filterWrap.length){
          var text = $(this).text();
          $filterWrap.find('.tgr-item-dropdown > span').text(text);
          var $filter = $(this).parent('.tgr-filter.isOpen');
          $filter.slideUp();
          $filter.removeClass('isOpen');

        }
      });
      //Show all items
      if( _.options.filters.hideAll ){
        _.$filter.find('.tgr-filter-item:first-child').trigger('click');
      }

      //Filter Dropdown
      _.$filter_wrap = _.$team.find('.tgr-filter-wrap');
      if(_.$filter_wrap.hasClass('tgr-filter-dropdown') ){
        _.$filter_wrap.find('.tgr-item-dropdown').on('click', function (event) {
          var $filter = $(this).next('.tgr-filter');
          $filter.slideToggle(function () {
            if(!$filter.is(':hidden')){
              $filter.addClass('isOpen');
            } else {
              $filter.removeClass('isOpen');
            }
          });
        });
      }
      $(document).on('click', function(e){
        if(!$(e.target).closest('.tgr-filter-dropdown').length) {
          var $filter = $('.tgr-filter.isOpen');
          $filter.slideUp();
          $filter.removeClass('isOpen');
        }
      });
    },

    events_displayer_popup: function () {
      var _ = this;
      $(window).on("resize", function () {
        _.set_dynamic_styles();
        if (_.is_open_popup() && (_.is_displayer_popup() || _.is_displayer_slide_in())) {
          _.resize_popup();
        }
      });
    },

    on_click_arrows_popup: function (event) {
      var _ = this;
      var index = _.find_member_item().data('index');
      var currentId = _.get_grid_item_id(index);
      var nextItem = false;
      var newItem = $();

      if ($(event.currentTarget).hasClass('tgr-arrow-next')) {
        nextItem = true;
        index = index == _.get_item_last_index() ? 0 : index + 1;
        for (var i = index; i <= _.get_item_last_index(); i++) {
          newItem = _.find_grid_item_by_index(i);
          if (newItem.is(':visible')) {
            break;
          }
          if (i == _.get_item_last_index()) {
            i = -1;//We restart the iteration until we find a visible item
          }
        }
      } else {
        index = index == 0 ? _.get_item_last_index() : index - 1;
        for (var i = index; i >= 0; i--) {
          newItem = _.find_grid_item_by_index(i);
          if (newItem.is(':visible')) {
            break;
          }
          if (i == 0) {
            i = _.get_item_last_index() + 1;//We restart the iteration until we find a visible item
          }
        }
      }
      //Update the new index
      index = i;
      var newId = _.get_grid_item_id(index);
      _.show_member_item_popup(currentId, newId, nextItem);
    },

    show_member_item_popup: function (currentId, newId, nextItem) {
      var _ = this;
      var html = _.get_html_member_item_popup(newId);
      _.find_popup_content().append(html);
      var ps = app.get_size_by_target(_.$popup);
      _.update_scroll_height(ps.height);
      _.find_member_item(newId).hide();

      if (_.options.displayer.popup.nextItemEffect == 'slide' && app.isActiveSlideEffect()) {
        var directionCurrent = nextItem ? 'left' : 'right';
        var directionNext = nextItem ? 'right' : 'left';
        _.find_member_item(currentId).hide('slide', { direction: directionCurrent }, 400, function () {
          $(this).remove();
        });
        _.find_member_item(newId).show('slide', { direction: directionNext }, 400);
      } else {
        _.find_member_item(currentId).remove();
        _.find_member_item(newId).fadeIn(400);
      }
    },

    events_displayer_inline: function () {
      var _ = this;
      _.$box_wrap.on('click', '.tgr-close-inline', function (event) {
        var $item_active = _.find_grid_item_active();
        _.close_displayer_inline($item_active);
      });
    },

    on_click_filter_item: function (event, $filter_item) {
      var _ = this;
      _.destroy_displayers();
      _.hide_show_items(event, $filter_item.data('filter-id'));
    },

    destroy_displayers: function () {
      var _ = this;
      _.destroy_displayer_inline();
    },

    destroy_displayer_inline: function () {
      var _ = this;
      _.find_displayer().remove();
      _.$box.find('.tgr-item').removeClass('tgr-active');
    },


    on_click_item: function (event, $item) {
      var _ = this;
      var $target = $(event.target);
      if ($target.closest('a').length) {
        var link = $target.closest('a').attr('href');
        if (link == '#') {
          event.preventDefault();
        }
        return;
      }

      _.add_classes_to_displayer();

      switch (_.get_displayer_type()) {
        case app.displayers.POPUP:
        case app.displayers.SLIDE_IN_LEFT:
        case app.displayers.SLIDE_IN_RIGHT:
          _.show_displayer_popup(event);
          break;
        case app.displayers.INLINE:
          _.show_displayer_inline(event);
          break;
        case app.displayers.MEMBER_LINK:
          var item_id = _.get_grid_item_id($target);
          var member = _.get_member_options(item_id);
          if (!app.is_empty(member)){
            var url = member.custom_url || member.permalink;
            app.redirect(url, _.options.displayer.targetLink);
          }
          break;
      }
    },

    show_displayer_popup: function (event) {
      var _ = this;
      if (_.is_opening_popup) {
        return;
      }

      var $figure = $(event.currentTarget);
      var id = _.get_grid_item_id($figure);
      var popup_html = '<div class="tgr-wrap tgr-team-'+_.team_id+'" data-id="'+_.team_id+'">';
      popup_html += '<div class="'+_.$box_wrap.attr('class')+'">';
      popup_html += _.get_html_displayer_popup(id);
      popup_html += '</div></div>';
      $('body').append(popup_html);
      _.$popup = _.find_displayer_popup();
      _.$overlay = _.find_overlay();
      _.open_popup(event);
    },

    add_classes_to_displayer: function () {
      var _ = this;
      if (_.is_displayer_popup() || _.is_displayer_slide_in()) {
        _.$box_wrap.addClass('tgr-displayer-popup');//Agregar para que el displayer SLIDE_IN tome los estilos del displayer popup
        if (_.is_displayer_slide_in()) {
          _.$box_wrap.addClass('tgr-displayer-slide-in');
        }
      }
    },

    open_popup: function (event) {
      var _ = this;
      if (!_.$popup.length) {
        return;
      }

      setTimeout(function () {
        _.show_popup();
        _.before_open_popup(event);

        _.find_popup_content().animateCSS_TeamGrid(_.options.displayer.popup.open.animation, {
          delay: 0,
          duration: app.parse_number(_.options.displayer.popup.open.duration),
          complete: function () {

          }
        });

        setTimeout(function () {
          _.show_hide_popup_controls(true);
        }, _.options.displayer.popup.open.duration / 2);

        setTimeout(function () {
          _.after_open_popup(event);
        }, app.parse_number(_.options.displayer.popup.open.duration) + 100);

      }, app.parse_number(_.options.displayer.popup.open.delay));
    },

    set_opening_popup: function (status) {
      this.is_opening_popup = status;
    },

    before_open_popup: function (event) {
      var _ = this;
      _.is_opening_popup = true;
      _.disable_page_scroll(true);
      _.show_overlay();
      _.resize_popup();
    },

    after_open_popup: function (event) {
      var _ = this;
      _.is_opening_popup = false;
      _.popup_is_open = true;
      $('body').addClass('tgr-popup-is-open');
      _.$popup.addClass('tgr-popup-is-open');
    },

    show_hide_popup_controls: function (status) {
      var _ = this;
      var opacity = 0.6;
      if( _.is_displayer_popup() ){
        opacity = 1;
      }
      if( status ){
        _.$popup.find('.tgr-arrow').fadeTo(500, status ? opacity : 0);
        _.$popup.find('.tgr-close').fadeTo(500, status ? opacity : 0);
      } else {
        _.$popup.find('.tgr-arrow').hide();
        _.$popup.find('.tgr-close').hide();
      }
    },

    resize_popup: function (width, height) {
      var _ = this;

      var op_popup_width = _.options.displayer.popup.width;
      var op_popup_height = _.options.displayer.popup.height;
      if (_.is_displayer_slide_in()) {
        op_popup_width = _.options.displayer.slide.width;
      }

      width = app.parse_number(width || op_popup_width);
      height = app.parse_number(height || op_popup_height);

      var top_space = 40;//Space for controls, prev, next and close
      var popup_height = height;

      if (_.is_displayer_popup()) {
        _.$popup.css('width', width);
        _.$popup.css('height', height);
      } else if (_.is_displayer_slide_in()) {
        popup_height = app.get_number_value('100%', 'vertical');
        _.options.displayer.popup.height = popup_height;
        _.$popup.css('max-width', width);
        _.$popup.css('height', popup_height);
      }

      setTimeout(function () {
        var ws = app.window_size();
        var ps = app.get_size_by_target(_.$popup);
        var vertical_size = ps.height + ps.margin.top + ps.margin.bottom;

        if (_.is_displayer_popup()) {
          if (vertical_size + top_space * 2 > ws.viewport.height || ws.viewport.width <= _.options.breakpoints.tablet) {
            popup_height = ws.viewport.height - top_space * 2 - 10;
            _.$popup.css('height', popup_height);
          }
        }
        setTimeout(function(){
          _.update_scroll_height(popup_height);
        }, 380);
      }, 150);
    },

    update_scroll_height: function (popup_height) {
      var _ = this;
      var member_item_size = app.get_size_by_target(_.find_displayer_popup().find('.tgr-member-item'));
      var maxHeight = member_item_size.height;
      var $scroll = _.find_scroll();

      $scroll.addClass('nano');
      $scroll.css('max-height', maxHeight);
      //Refresh the scrollbar. This simply re-calculates the position and height of the scrollbar gadget.
      $scroll.nanoScroller();
    },

    close_popup: function () {
      var _ = this;
      if (!_.is_open_popup() || _.popup_is_closing) {
        return;
      }
      _.popup_is_closing = true;
      _.before_close_popup();
      //Animate close
      _.find_popup_content().animateCSS_TeamGrid(_.options.displayer.popup.close.animation, {
        delay: 0,
        duration: app.parse_number(_.options.displayer.popup.close.duration),
        complete: function () {
          _.find_displayer().hide();
        }
      });
      setTimeout(function () {
        _.after_close_popup();
      }, Math.max(100, app.parse_number(_.options.displayer.popup.close.duration) - 150));
    },

    before_close_popup: function () {
      var _ = this;
      _.show_hide_popup_controls(false);
    },

    after_close_popup: function (event) {
      var _ = this;
      _.popup_is_closing = false;
      _.popup_is_open = false;
      _.disable_page_scroll(false);
      _.close_overlay();
      _.hide_popup();
      _.find_displayer().closest('.tgr-team-'+_.team_id).remove();
      $('body').removeClass('tgr-popup-is-open');
    },

    show_displayer_inline: function (event) {
      var _ = this;
      var $figure = $(event.currentTarget);
      var id = _.get_grid_item_id($figure);
      var $item = _.find_grid_item_by_target($figure);
      //Si se hizo click sobre el item activo
      if ($item.hasClass('tgr-active')) {
        _.close_displayer_inline($item);
      } else {
        $item.addClass('tgr-active').siblings().removeClass('tgr-active');
        _.close_displayer_inline($item, function (showWithSlide) {
          $item.after(_.get_html_displayer_inline(id));
          _.$inline = _.find_displayer_inline();

          if (showWithSlide) {
            _.find_displayer().slideDown(400, function () {
            });
          } else {
            _.find_displayer().fadeIn(400);
          }
          if (_.options.displayer.autoScroll) {
            app.scroll_to($item, 500, 5);
          }
          _.refresh_scroll();
          _.set_position_triangle_inline();
        });
      }
    },

    close_displayer_inline: function ($item, show_callback) {
      var _ = this;
      //Delete the last one if there is more than one content inline
      _.$box.find('.tgr-displayer:gt(0)').remove();
      var showWithSlide = !_.find_displayer().length;
      //If the same item was clicked, then just hide it
      if (!$.isFunction(show_callback)) {
        $item.removeClass('tgr-active');
        _.find_displayer().slideUp(350, function () {
          $(this).remove();
        });
      } else {
        _.find_displayer().remove();
        if ($.isFunction(show_callback)) {
          show_callback(showWithSlide);
        }
      }
    },

    get_html_displayer_popup: function (id) {
      var _ = this;
      var html = '';
      var position = 'tgr-position-middle-center';
      if (_.is_displayer_slide_in(app.displayers.SLIDE_IN_LEFT)) {
        position = 'tgr-position-middle-left';
      } else if (_.is_displayer_slide_in(app.displayers.SLIDE_IN_RIGHT)) {
        position = 'tgr-position-middle-right';
      }
      html += '<div class="tgr-member tgr-displayer tgr-displayer-'+_.team_id+'" data-instance-id="'+_.instance_id+'">';
      html += '<div class="tgr-popup tgr-popup-' + _.team_id + ' ' +  position + '">';
      html += '<div class="tgr-popup-content">';
      html += _.get_html_member_item_popup(id);
      html += '</div>';//.tgr-popup-content
      html += _.get_html_arrows_popup();
      html += _.get_html_close_popup();
      html += '</div>';//.tgr-popup
      html += '<div class="tgr-overlay"><div class="tgr-overlay-bg"></div></div>';
      html += '</div>';//.tgr-displayer

      return html;
    },

    get_html_member_item_popup: function (id) {
      var _ = this;
      var html = '';
      var member = _.get_member_options(id);
      if (app.is_empty(member)) return '';
      var index = _.get_grid_item_index(id);
      html += '<div class="tgr-member-item" data-id="' + id + '" data-index="' + index + '">';
      html += '<div class="tgr-scroll">';
      html += '<div class="tgr-scroll-inside nano-content">';
      html += '<div class="tgr-flexbox">';
      html += '<div class="tgr-left">';
      html += '<div class="tgr-member-image">';
      html += '<img src="' + member.image + '">';
      html += '</div>';//.tgr-member-image
      html += _.build_member_social(member);
      html += '</div>';//.tgr-left
      html += '<div class="tgr-right">';
      html += _.build_member_header(member);
      html += _.build_member_content(member);
      html += _.build_member_fields(member);
      html += _.build_member_skills(member);
      html += '</div>';//.tgr-right
      html += '</div>';//.tgr-flexbox
      html += '</div>';//.tgr-scroll-inside
      html += '</div>';//.tgr-scroll
      html += '</div>';//.tgr-member-item
      return html;
    },

    get_html_arrows_popup: function () {
      var _ = this;
      var html = '';
      html += '<div class="tgr-arrow tgr-arrow-prev tgr-arrow-' + _.options.displayer.popup.arrows.icon + '">';
      if (_.options.displayer.popup.arrows.icon == 'default') {
        html += '<div class="tgr-arrow-default-top"></div><div class="tgr-arrow-default-bottom"></div>';
      }
      html += '</div>';//.tgr-arrow-prev
      html += '<div class="tgr-arrow tgr-arrow-next tgr-arrow-' + _.options.displayer.popup.arrows.icon + '">';
      if (_.options.displayer.popup.arrows.icon == 'default') {
        html += '<div class="tgr-arrow-default-top"></div><div class="tgr-arrow-default-bottom"></div>';
      }
      html += '</div>';//.tgr-arrow-next
      return html;
    },

    get_html_close_popup: function () {
      var _ = this;
      var html = '';
      html += '<div class="tgr-close tgr-close-' + _.options.displayer.popup.close.icon + '">';
      if (_.options.displayer.popup.arrows.icon == 'default') {
        html += '<div class="tgr-close-default-one"></div><div class="tgr-close-default-two"></div>';
      }
      html += '</div>';//.tgr-close
      return html;
    },

    set_position_triangle_inline: function () {
      var _ = this;
      var $item_active = _.find_grid_item_active();
      var $triangle_inline = _.$box_wrap.find('.tgr-triangle-inline');
      if( !$item_active.length || ! $triangle_inline.length ){
        return;
      }
      var border_arrow = parseInt($triangle_inline.css('border-width'));
      border_arrow = isNaN(border_arrow) ? 12 : border_arrow;
      var size_active = app.get_size_by_target($item_active);
      var size_box_inner = app.get_size_by_target(_.$box_inner);
      //var pos = size_active.position.left + (size_active.innerWidth / 2) + Math.abs(size_box_inner.margin.left)-border_arrow;
      var pos = size_active.position.left + (size_active.innerWidth / 2) - border_arrow;
      $triangle_inline.css('left', pos);
    },

    get_html_displayer_inline: function (id) {
      var _ = this;
      var html = '';
      var member = _.get_member_options(id);
      if (app.is_empty(member)) return '';
      html += '<div class="tgr-member tgr-displayer tgr-displayer-'+_.team_id+'" data-instance-id="'+_.instance_id+'">';
      html += '<div class="tgr-triangle-inline"></div><div class="tgr-close-inline"></div>';
      html += '<div class="tgr-flexbox">';
      html += '<div class="tgr-left">';
      html += '<div class="tgr-scroll">';
      html += '<div class="tgr-scroll-inside nano-content">';
      html += _.build_member_header(member);
      html += _.build_member_content(member);
      html += '</div>';//.tgr-scroll-inside
      html += '</div>';//.tgr-scroll
      html += '</div>';//.tgr-left
      html += '<div class="tgr-right">';
      html += _.build_member_fields(member);
      html += _.build_member_skills(member);
      html += _.build_member_social(member);
      html += '</div>';//.tgr-right
      html += '</div>';//.tgr-flexbox
      html += '</div>';//.tgr-displayer
      return html;
    },

    get_html_layout_list: function (id) {
      var _ = this;
      var html = '';
      var member = _.get_member_options(id);
      if (app.is_empty(member)) return '';
      html += '<div class="tgr-member">';
      html += '<div class="tgr-flexbox">';
      html += '<div class="tgr-left">';
      html += '<div class="tgr-member-image">';
      html += '<img src="' + member.image + '">';
      html += '</div>';//.tgr-member-image
      html += '</div>';//.tgr-left
      html += '<div class="tgr-right">';
      html += _.build_member_header(member);
      html += _.build_member_content(member);
      html += _.build_member_fields(member);
      html += _.build_member_skills(member);
      html += _.build_member_social(member);
      html += '</div>';//.tgr-right
      html += '</div>';//.tgr-flexbox
      html += '</div>';//.tgr-displayer
      return html;
    },

    build_member_header: function (member) {
      var _ = this;
      var html = '';
      html += '<div class="tgr-member-header">';
      if (_.options.member.titleAfterRole) {
        html += _.get_member_role(member);
        html += _.get_member_title(member);
      } else {
        html += _.get_member_title(member);
        html += _.get_member_role(member);
      }
      html += '</div>';
      return html;
    },

    get_member_options: function (id) {
      var _ = this;
      return _.options.isDesign ? TGR_SKIN_MEMBERS[id] : TGR_MEMBERS[id];
    },

    get_member_title: function (member) {
      var _ = this;
      var html = '';
      html += '<div class="tgr-member-title">';
      html += '<' + _.options.member.titleTag + '>' + member.title + '</' + _.options.member.titleTag + '>';
      html += '</div>';
      return html;
    },
    get_member_role: function (member) {
      var _ = this;
      var html = '';
      html += '<div class="tgr-member-role">';
      html += '<' + _.options.member.roleTag + '>' + member.role + '</' + _.options.member.roleTag + '>';
      html += '</div>';
      return html;
    },

    build_member_content: function (member) {
      var _ = this;
      var html = '';
      html += '<div class="tgr-member-content">';
      html += member.content;
      html += '</div>';//.tgr-member-content
      return html;
    },

    build_member_social: function (member) {
      var _ = this;
      var html = '';
      if( !member.social.length ) return '';
      html += '<div class="tgr-member-social">';
      if( TGR_PUBLIC_JS.generalSettings.socialIcons.title ){
        html += TGR_PUBLIC_JS.generalSettings.socialIcons.title;
      }
      html += '<ul>';
      member.social.forEach(function (link, i) {
        html += '<li><a href="' + link.url + '" target="_blank" class="tgr-member-link tgr-animation-bounce-in" title="'+link.title+'">';
        if (link.custom_icon) {
          html += link.custom_icon;
        } else {
          html += '<i class="' + link.icon + '"></i>';
        }
        html += '</a></li>';
      });
      html += '</ul></div>';//.tgr-member-social
      return html;
    },

    build_member_fields: function (member) {
      var _ = this;
      var html = '';
      if( !member.fields.length ) return '';
      html += '<div class="tgr-member-fields">';
      if( TGR_PUBLIC_JS.generalSettings.fields.title ){
        html += TGR_PUBLIC_JS.generalSettings.fields.title;
      }
      member.fields.forEach(function (field, i) {
        html += '<p>';
        if( field.icon ){
          html += '<i class="' + field.icon + '"></i>';
        }
        if( field.name ){
          html += '<span>' + field.name + '</span>';
        }
        html += ': ';
        if (field.url_type == 'auto') {
          if (app.is_email(field.value)) {
            html += '<a href="mailto:' + field.value + '">' + field.value + '</a>';
          } else {
            html += field.value;
          }
        } else {
          html += '<a href="' + field.url + '" target="' + field.target + '">' + field.value + '</a>';
        }
        html += '</p>';
      });
      html += '</div>';//.tgr-member-fields
      return html;
    },

    build_member_skills: function (member) {
      var _ = this;
      var html = '';
      if( !member.skills.length ) return '';
      html += '<div class="tgr-member-skills">';
      if( TGR_PUBLIC_JS.generalSettings.skills.title ){
        html += TGR_PUBLIC_JS.generalSettings.skills.title;
      }
      member.skills.forEach(function (skill, i) {
        html += '<div class="tgr-member-skill">';
        var percentage = skill.percent + (_.options.skills.showPercent ? '%' : '');
        if( skill.percent == '' || skill.percent == '0' ){
          percentage = '';
        }
        html += '<span class="tgr-skill-name">'+ skill.name + ' ' + percentage;
        if( skill.time ){
          html += ' - ' + skill.time;
        }
        html += '</span>';
        html += '<div class="tgr-skill-bg"><span class="tgr-skill-percent" style="width: '+skill.percent+'%"></span></div>';
        html += '</div>';
      });
      html += '</div>';//.tgr-member-fields
      return html;
    },

    set_dynamic_styles: function () {
      var _ = this;
      _.update_item_grid_heights();
      _.update_item_grid_sizes();
      _.set_position_triangle_inline();
      _.refresh_scroll();
    },

    refresh_scroll: function () {
      var _ = this;
      var ws = app.window_size();
      //console.log("ws", ws);
      //console.log("_.options.breakpoints.tablet", _.options.breakpoints.tablet);
      if( _.is_displayer_inline() ){
        if(ws.viewport.width <= _.options.breakpoints.tablet){//834
          _.destroy_scroll();
        } else {
          _.init_scroll();
        }
      }
    },

    update_item_grid_heights: function () {
      var _ = this;
      if( !_.options.layout.equalHeights || !_.is_layout([1, 10, 12 ]) ){
        return;
      }
      _.$items.find('.tgr-figure').css('height', 'auto');
      setTimeout(function(){
        var maxHeight = 0;
        _.$items.each(function(index, item){
          var height = app.get_size_by_target($(item).find('.tgr-figure')).outerHeight;
          if( height > maxHeight ){
            maxHeight = height;
          }
        });
        //Cuando se está dentro de un div oculto el valor de maxHeight puede ser 0
        if( maxHeight >= 10 ){
          _.$items.find('.tgr-figure').css('height', app.css_number(maxHeight, 'px'));
          if( _.is_layout([1]) ){
            var imageHeight = _.$items.first().find('.tgr-item-image').outerHeight(true);
            if( imageHeight > 0 ){
              _.$items.find('.tgr-figcaption').css('height', maxHeight - imageHeight);
            }
          }
        }
      }, 1100);
    },

    update_item_grid_sizes: function () {
      var _ = this;
      if (_.options.responsiveBy != 'window') {
        var $grid_items = _.$items.filter('.tgr-grid-item');
        var ref = app.get_size_by_target(_.$team);
        $grid_items.css('width', '');
        if (ref.width <= _.options.breakpoints.mobile) {//768
          $grid_items.css('width', '100%');
        } else if (ref.width <= _.options.breakpoints.tablet) {//834
          $grid_items.css('width', '50%');
        } else if (ref.width <= _.options.breakpoints.laptop) {//1024
          if (_.options.layout.columns > 3) {
            $grid_items.css('width', '33.333%');
          }
        } else if (ref.width <= _.options.breakpoints.large) {//1280
          if (_.options.layout.columns > 4) {
            $grid_items.css('width', '25%');
          }
        } else if (ref.width <= _.options.breakpoints.extraLarge) {//1560
          if (_.options.layout.columns > 5) {
            $grid_items.css('width', '20%');
          }
        } else {
          $grid_items.css('width', '');
        }
      }
    },

    set_initial_styles: function () {
      var _ = this;
      var marginInlineLayout = _.options.layout.columnsGap / 2;

      _.$box_wrap.css('background', _.options.bgColor);

      if (!_.is_layout_table() && !_.is_layout_list()) {
        _.$box_inner.css('margin-left', -marginInlineLayout);
        _.$box_inner.css('margin-right', -marginInlineLayout);
        _.$items.css('padding-top', _.options.layout.columnsGap);
        _.$items.css('padding-left', marginInlineLayout);
        _.$items.css('padding-right', marginInlineLayout);
      }

      //Social icons will always be visible in hover
      if( !_.is_layout_table() && !_.is_layout_list() ){
        _.$box_wrap.addClass('tgr-social-icons-visible-hover');
        if(!_.options.layout.grid.headings.visible ){
          _.$box_wrap.addClass('tgr-headings-hide');
        }
        if (_.options.layout.grid.socialIcons.visible) {
          _.$box_wrap.addClass('tgr-social-icons-visible');
        } else {
          _.$box_wrap.addClass('tgr-social-icons-hide');
        }
        if (_.options.layout.grid.description.visible) {
          _.$box_wrap.addClass('tgr-description-visible');
        } else {
          _.$box_wrap.addClass('tgr-description-hide');
        }
        if (_.options.layout.grid.description.visibleOnHover) {
          _.$box_wrap.addClass('tgr-description-visible-hover');
        }
      }

      if (_.is_layout_list()) {
        if (_.options.layout.list.isRight) {
          _.$box_wrap.addClass('tgr-list-right');
        }
      }

      //Hide list of social icons without no icons
      _.$items.each(function (index, item) {
        if( $(item).find('.tgr-item-image .tgr-item-social').children().length == 0 ){
          $(item).find('.tgr-item-image .tgr-item-social').css('margin', 0).hide();
        }
        if( $(item).find('.tgr-figcaption .tgr-item-social').children().length == 0 ){
          $(item).find('.tgr-figcaption .tgr-item-social').css('margin', 0).hide();
        }
      });

      if (_.is_layout([5, 6])) {//4,5
        _.$items.each(function (index, item) {
          var captionSize = app.get_size_by_target($(item).find('.tgr-figcaption'));
          var headingsHeight = app.get_size_by_target($(item).find('.tgr-figcaption .tgr-item-header')).outerHeight;
          var socialHeight = 0;
          if (_.options.layout.grid.socialIcons.visible) {
            socialHeight = app.get_size_by_target($(item).find('.tgr-figcaption .tgr-item-social')).outerHeight;
          }
          var descHeight = 0;
          var captionHeight = captionSize.padding.top + captionSize.padding.bottom + headingsHeight + socialHeight + descHeight;
          $(item).find('.tgr-figcaption').css('transform', 'translateY(100%) translateY(-' + captionHeight + 'px)');
        });
      }

      if (_.is_layout(7)) {//6
        _.$items.each(function (index, item) {
          var captionHeight = app.get_size_by_target($(item).find('.tgr-figcaption')).innerHeight;
          if ($(item).find('.tgr-figcaption .tgr-item-desc').is(':visible')) {
            captionHeight += 5;
          }
          $(item).find('.tgr-figure').css('padding-bottom', captionHeight);
        });
      }
      if (_.is_layout([9, 11])) {//8,10
        _.$items.each(function (index, item) {
          var captionSize = app.get_size_by_target($(item).find('.tgr-figcaption'));
          var headingsHeight = app.get_size_by_target($(item).find('.tgr-figcaption .tgr-item-header')).outerHeight;
          var socialHeight = 0;
          if ($(item).find('.tgr-figcaption .tgr-item-social').is(':visible')) {
            socialHeight = app.get_size_by_target($(item).find('.tgr-figcaption .tgr-item-social')).outerHeight;
          }
          var captionHeight = captionSize.padding.top + captionSize.padding.bottom + headingsHeight + socialHeight;
          var extraPadding = _.is_layout([9]) ? 0 : 50;
          $(item).find('.tgr-figure').css('padding-bottom', captionHeight + extraPadding);
          $(item).find('.tgr-figcaption').css('height', captionHeight);
        });
      }

      _.$items.find('.tgr-item-inner').on('mouseleave', function (e) {
        if ($(e.currentTarget).closest('.tgr-active').length) {
          return;
        }
      });
      _.$items.find('.tgr-item-inner').on('mouseenter', function (e) {
        if ($(e.currentTarget).closest('.tgr-active').length) {
          return;
        }
        if (_.is_layout(7)) {//6
          $(e.currentTarget).find('.tgr-figcaption .tgr-item-title').css('opacity', 0).fadeTo(400, 1);
          $(e.currentTarget).find('.tgr-figcaption .tgr-item-subtitle').css('opacity', 0).fadeTo(400, 1);
          if (_.options.layout.grid.description.visibleOnHover) {
            $(e.currentTarget).find('.tgr-figcaption .tgr-item-desc').css('opacity', 0).fadeTo(400, 1);
          }
        }
      });
      _.$box_inner.find('.tgr-flip-card-container').hover(function (event) {
        $(event.currentTarget).find('.tgr-flip-card').toggleClass('tgr-apply-flip');
      });

      if( _.options.refresh || _.options.isDesign ){
        _.set_refresh_styles();
      }
      //Estos estilos deben prevalecer sobre los anteriores
      _.set_image_zoom_effect_styles();
      _.set_filter_styles();
      _.set_displayer_styles();
      _.set_skills_styles();
      _.set_social_styles();

      _.render_style();
    },

    add_style: function (css, media_query) {
      var _ = this;
      _.styles.push(css.build_css(null, media_query));
    },

    render_style: function () {
      var _ = this;
      var style = '';
      _.styles.forEach(function(str_style){
        style += str_style+"\n";
      });
      _.$team.append('<style id="tgr-style">'+style+'</style>');
    },

    set_refresh_styles: function () {
      var _ = this;
      //Clear backend styles
      $('.tgr-style-backend[data-id="'+_.team_id+'"]').remove();
      _.set_font_styles();
      _.set_border_styles();
      _.set_grid_styles();
      _.set_list_styles();
      _.set_table_styles();
    },

    set_image_zoom_effect_styles: function () {
      var _ = this;
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-img');
      css.prop('transition-duration', _.options.layout.imageZoomDuration+'s'  );
      css.prop('transition-timing-function', _.options.layout.imageZoomEffect );
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-inner:hover .tgr-img');
      css.prop('transform', 'scale('+_.options.layout.imageZoomScale+')'  );
      _.add_style(css);
    },

    set_filter_styles: function () {
      var _ = this;
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter');
      if( _.filters.separate ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item');
        css.prop('margin-left', app.css_number(_.options.filters.gap/2, 'px')  );
        css.prop('margin-right', app.css_number(_.options.filters.gap/2, 'px')  );
        css.prop('padding', _.options.filters.padding );
      }
      css.prop('color', _.options.filters.textColor  );
      css.prop('font-family', _.options.filters.fontFamily + ', sans-serif' );
      app.add_link_rel_google_font(_.$team, _.options.filters.fontFamily);
      css.prop('text-transform', _.options.filters.uppercaseText ? 'uppercase' : 'none' );
      css.prop('font-size', app.css_number(_.options.filters.textSize, 'px')  );
      css.prop('border-width', app.css_number(_.options.filters.borderWidth, 'px')  );
      css.prop('border-color', _.options.filters.borderColor  );
      css.prop('border-radius', app.css_number(_.options.filters.borderRadius, 'px')  );

      if( _.options.filters.bgGradientEnabled ){
        css.prop('background', 'linear-gradient(' + _.options.filters.bgGradientAngle + ', ' + _.options.filters.bgColor + ', ' + _.options.filters.bgGradientColor + ')'  );
      } else {
        css.prop('background', _.options.filters.bgColor  );
      }
      _.add_style(css);

      if( !_.filters.separate ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item');
        css.prop('margin-left', app.css_number(_.options.filters.gap/2, 'px')  );
        css.prop('margin-right', app.css_number(_.options.filters.gap/2, 'px')  );
        css.prop('padding', _.options.filters.padding );
        _.add_style(css);
      }

      //Add a transparent border to avoid a small error when hovering in case the hover has a border
      if( !_.filters.separate && !_.options.filters.borderBottomOnlyActive ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item');
        css.prop('border-color', 'transparent'  );
        css.prop('border-width', app.css_number(_.options.filters.borderWidthActive, 'px')  );
        _.add_style(css);
      }

      //Checkbox
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-checkbox');
      css.prop('border-color', _.options.filters.textColor  );
      _.add_style(css);


      //Hover
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item:hover');
      css.prop('color', _.options.filters.textColorHover  );
      if( _.options.filters.borderBottomOnlyActive ){
        css.prop('border-color', 'transparent'  );//To use :after
      } else {
        css.prop('border-color', _.options.filters.borderColorHover  );
        css.prop('border-width', app.css_number(_.options.filters.borderWidthActive, 'px')  );
      }
      if( _.options.filters.bgGradientEnabledHover ){
        css.prop('background', 'linear-gradient(' + _.options.filters.bgGradientAngleHover + ', ' + _.options.filters.bgColorHover + ', ' + _.options.filters.bgGradientColorHover + ')'  );
      } else {
        css.prop('background', _.options.filters.bgColorHover  );
      }
      _.add_style(css);

      if( _.options.filters.borderBottomOnlyActive ){
        //:after
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item:hover:after');
        css.prop('background', _.options.filters.borderColorHover  );
        css.prop('height', app.css_number(_.options.filters.borderWidthActive, 'px')  );
        _.add_style(css);
      }

      //Checkbox hover
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item:hover .tgr-filter-checkbox');
      css.prop('border-color', _.options.filters.textColorHover  );
      _.add_style(css);



      //Active
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item.tgr-active-filter');
      css.prop('color', _.options.filters.textColorActive  );
      if( _.options.filters.borderBottomOnlyActive ){
        css.prop('border-color', 'transparent'  );//To use :after
      } else {
        css.prop('border-color', _.options.filters.borderColorActive  );
        css.prop('border-width', app.css_number(_.options.filters.borderWidthActive, 'px')  );
      }
      if( _.options.filters.bgGradientEnabledActive ){
        css.prop('background', 'linear-gradient(' + _.options.filters.bgGradientAngleActive + ', ' + _.options.filters.bgColorActive + ', ' + _.options.filters.bgGradientColorActive + ')'  );
      } else {
        css.prop('background', _.options.filters.bgColorActive  );
      }
      _.add_style(css);

      if( _.options.filters.borderBottomOnlyActive ){
        //:after
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item.tgr-active-filter:after');
        css.prop('background', _.options.filters.borderColorActive  );
        css.prop('height', app.css_number(_.options.filters.borderWidthActive, 'px')  );
        _.add_style(css);
      }

      //Checkbox active
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-filter .tgr-filter-item.tgr-active-filter .tgr-filter-checkbox');
      css.prop('border-color', _.options.filters.textColorActive  );
      _.add_style(css);

    },

    set_skills_styles: function () {
      var _ = this;
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-member-skills .tgr-skill-bg');
      css.prop('background', _.options.skills.bgColor  );
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-member-skills .tgr-skill-percent');
      css.prop('background', _.options.skills.bgPercent  );
      _.add_style(css);

    },

    set_social_styles: function () {
      var _ = this;

      var iconFontSize, iconSize;
      //Styles for the List Layout icons
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-inner .tgr-member-social a');
      iconFontSize = app.parse_number(_.options.layout.textSize);
      iconSize = Math.round( iconFontSize * 2.5);

      css.prop('font-size', app.css_number(iconFontSize, 'px'));
      css.prop('color', _.options.social.iconsColor);
      css.prop('border-color', _.options.social.iconsColor);
      css.prop('border-radius', app.css_number(_.options.social.iconsBorderRadius, 'px'));
      css.prop('width', app.css_number(iconSize, 'px'));
      css.prop('height', app.css_number(iconSize, 'px'));
      css.prop('line-height', app.css_number(iconSize - 1, 'px'));
      _.add_style(css);

      //Estilos para los íconos dentro del Viewer
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer .tgr-member-social a');
      iconFontSize = app.parse_number(_.options.displayer.textSize);
      iconSize = Math.round( iconFontSize * 2.5);

      css.prop('font-size', app.css_number(iconFontSize, 'px'));
      css.prop('color', _.options.social.iconsColor);
      css.prop('border-color', _.options.social.iconsColor);
      css.prop('border-radius', app.css_number(_.options.social.iconsBorderRadius, 'px'));
      css.prop('width', app.css_number(iconSize, 'px'));
      css.prop('height', app.css_number(iconSize, 'px'));
      css.prop('line-height', app.css_number(iconSize - 1, 'px'));
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-member-social a:hover');
      css.prop('color', _.options.social.iconsColorHover);
      css.prop('border-color', _.options.social.iconsColorHover);
      _.add_style(css);
    },

    set_font_styles: function () {
      var _ = this;

      app.add_link_rel_google_font(_.$team, _.options.font.heading1);
      app.add_link_rel_google_font(_.$team, _.options.font.heading2);
      app.add_link_rel_google_font(_.$team, _.options.font.content);

      //Font family
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-desc, .tgr-team-' + _.team_id + ' .tgr-member-content, .tgr-team-' + _.team_id + ' .tgr-member-fields');
      css.prop('font-family', _.options.font.content + ', sans-serif');
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-title, .tgr-team-' + _.team_id + ' .tgr-member-title, .tgr-team-' + _.team_id + ' .tgr-box-wrapper .tgr-member-content h1');
      css.prop('font-family', _.options.font.heading1 + ', sans-serif');
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-subtitle, .tgr-team-' + _.team_id + ' .tgr-member-role, .tgr-team-' + _.team_id + ' .tgr-box-wrapper .tgr-member-content h2, .tgr-team-' + _.team_id + ' .tgr-box-wrapper .tgr-member-content h3, .tgr-team-' + _.team_id + ' .tgr-box-wrapper .tgr-member-content h4, .tgr-team-' + _.team_id + ' .tgr-member-social h4, .tgr-team-' + _.team_id + ' .tgr-member-fields h4, .tgr-team-' + _.team_id + ' .tgr-member-skills h4');
      css.prop('font-family', _.options.font.heading2 + ', sans-serif');
      _.add_style(css);


      //Text color
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image, .tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table, .tgr-team-' + _.team_id + ' .tgr-layout-type-list .tgr-member');
      css.prop('color', _.options.layout.textColor);
      _.add_style(css);

      if(_.is_layout([1] )){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image');
        css.prop('color', _.options.layout.textColor2);
        _.add_style(css);
      }else if( _.is_layout([8] ) ){//7
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-item-image, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-grid-item.tgr-active .tgr-item-inner .tgr-item-image');
        css.prop('color', _.options.layout.textColor2);
        _.add_style(css);
      }else if( _.is_layout([10,12] ) ){//9,11
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-flip-back .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-grid-item.tgr-active .tgr-item-inner .tgr-figcaption');
        css.prop('color', _.options.layout.textColor2);
        _.add_style(css);
      }else if( _.is_layout([7] ) ){//6,7,9,11
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-grid-item.tgr-active .tgr-item-inner .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-item-image, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-grid-item.tgr-active .tgr-item-inner .tgr-item-image');
        css.prop('color', _.options.layout.textColor2);
        _.add_style(css);
      }

      //Links color
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-member a:not(.tgr-item-link)');
      css.prop('color', _.options.layout.linkColor);
      _.add_style(css);

      //Text size
      if( _.is_layout_table() ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table');
        css.prop('font-size', app.css_number(_.options.layout.textSize, 'px'));
        _.add_style(css);

        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table .tgr-thead');
        css.prop('font-size', app.css_number(_.options.layout.textSizeHeading1, 'px'));
        _.add_style(css);
      } else {
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-figure, .tgr-team-' + _.team_id + ' .tgr-item-inner .tgr-member-content, .tgr-team-' + _.team_id + ' .tgr-item-inner .tgr-member-fields, .tgr-team-' + _.team_id + ' .tgr-item-inner .tgr-member-skills');
        css.prop('font-size', app.css_number(_.options.layout.textSize, 'px'));
        _.add_style(css);

        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-title, .tgr-team-' + _.team_id + ' .tgr-item-inner .tgr-member-title');
        css.prop('font-size', app.css_number(_.options.layout.textSizeHeading1, 'px'));
        _.add_style(css);

        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-item-subtitle, .tgr-team-' + _.team_id + ' .tgr-item-inner .tgr-member-role, .tgr-team-' + _.team_id + ' .tgr-member-social h4, .tgr-team-' + _.team_id + ' .tgr-member-fields h4, .tgr-team-' + _.team_id + ' .tgr-member-skills h4');
        css.prop('font-size', app.css_number(_.options.layout.textSizeHeading2, 'px'));
        _.add_style(css);
      }
    },

    set_border_styles: function () {
      var _ = this;
      if(_.is_layout([9, 11])){//8, 10
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css);
        if( _.options.layout.borderDifferentHover ){
          var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover');
          css.prop('border-width', app.css_number(_.options.layout.borderWidth2, 'px'));
          css.prop('border-color', _.options.layout.borderColor2);
          _.add_style(css);
        }
      } else if(_.is_layout([13])){//12
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-flip-back');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css);
        if( _.options.layout.borderDifferentHover ){
          var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-flip-back');
          css.prop('border-width', app.css_number(_.options.layout.borderWidth2, 'px'));
          css.prop('border-color', _.options.layout.borderColor2);
          _.add_style(css);
        }
      } else if(_.is_layout(14)) {//13
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:before');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css);
        if( _.options.layout.borderDifferentHover ){
          var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover:before');
          css.prop('border-width', app.css_number(_.options.layout.borderWidth2, 'px'));
          css.prop('border-color', _.options.layout.borderColor2);
          _.add_style(css);
        }
      } else if(_.is_layout(15)) {//14
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css);

        if( _.options.layout.borderDifferentHover ){
          var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption');
          css.prop('border-width', app.css_number(_.options.layout.borderWidth2, 'px'));
          css.prop('border-color', _.options.layout.borderColor2);
          _.add_style(css);
        }
      } else {
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figure');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css);
        if( _.options.layout.borderDifferentHover ){
          var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-figure');
          css.prop('border-width', app.css_number(_.options.layout.borderWidth2, 'px'));
          css.prop('border-color', _.options.layout.borderColor2);
          _.add_style(css);
        }
      }
    },

    set_grid_styles: function () {
      var _ = this;

      //Inline arrow
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-inline .tgr-item-inner:after');
      css.prop('border-bottom-color', _.options.displayer.bgColor);
      _.add_style(css);

      if (_.is_layout([1, 2, 3, 4, 5, 6 ])) {//1, 2, 3, 4, 5, 6
        _.set_styles_to_grid_layouts();
      } else if (_.is_layout(7)) {//6
        _.set_styles_to_grid_layout_7();
      } else if (_.is_layout(8)) {//7
        _.set_styles_to_grid_layout_8();
      } else if (_.is_layout([9, 11])) {//8,10
        _.set_styles_to_grid_layout_9_11();
      } else if (_.is_layout([10, 12, 13])) {//9, 11, 12
        _.set_styles_to_grid_layout_flip_cards();
      } else if (_.is_layout([14, 15])) {//13, 14
        _.set_styles_to_grid_layout_14_15();
      }
    },

    get_grid_background: function (status, gradient) {
      var _ = this;
      if (status == 2) {
        if (gradient) {
          return 'linear-gradient(' + _.options.layout.bgGradientAngle2 + ', ' + _.options.layout.bgColor2 + ', ' + _.options.layout.bgGradientColor2 + ')';
        } else {
          return _.options.layout.bgColor2;
        }
      } else {
        if (gradient) {
          return 'linear-gradient(' + _.options.layout.bgGradientAngle + ', ' + _.options.layout.bgColor + ', ' + _.options.layout.bgGradientColor + ')';
        } else {
          return _.options.layout.bgColor;
        }
      }
    },

    set_styles_to_grid_layouts: function () {
      var _ = this;

      //Bg [2, 3, 4, 5, 6]
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);

      if(_.is_layout([1])){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-active .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-figcaption');
        if (_.options.layout.bgGradientEnabled2) {
          css.prop('background', _.get_grid_background(2, true));
        } else {
          css.prop('background', _.get_grid_background(2, false));
        }
        _.add_style(css);
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image .tgr-item-desc');
        if (_.options.layout.bgGradientEnabled2) {
          css.prop('background', _.get_grid_background(2, true));
        } else {
          css.prop('background', _.get_grid_background(2, false));
        }
        _.add_style(css);

      }
    },

    set_styles_to_grid_layout_7: function () {
      var _ = this;

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption:before');
      if (_.options.layout.bgGradientEnabled2) {
        css.prop('background', _.get_grid_background(2, true));
      } else {
        css.prop('background', _.get_grid_background(2, false));
      }
      _.add_style(css);
    },

    set_styles_to_grid_layout_8: function () {
      var _ = this;

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-social, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-desc');
      if (_.options.layout.bgGradientEnabled2) {
        css.prop('background', _.get_grid_background(2, true));
      } else {
        css.prop('background', _.get_grid_background(2, false));
      }
      _.add_style(css);
    },

    set_styles_to_grid_layout_9_11: function () {
      var _ = this;

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-grid-item.tgr-active .tgr-figcaption');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', 'linear-gradient(' + _.options.layout.bgGradientAngle + ', rgba(255,255,255,0), '+ _.options.layout.bgGradientColor+')');
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);
    },

    set_styles_to_grid_layout_flip_cards: function () {
      var _ = this;

      if(_.is_layout([13])){//12
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-flip-back');
        if (_.options.layout.bgGradientEnabled) {
          css.prop('background', _.get_grid_background(1, true));
        } else {
          css.prop('background', _.get_grid_background(1, false));
        }
        _.add_style(css);
      } else {
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figure');
        if (_.options.layout.bgGradientEnabled) {
          css.prop('background', _.get_grid_background(1, true));
        } else {
          css.prop('background', _.get_grid_background(1, false));
        }
        _.add_style(css);

        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-flip-back, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-inner:hover .tgr-figure, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-grid-item.tgr-active .tgr-figure, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image .tgr-item-social');
        if (_.options.layout.bgGradientEnabled2) {
          css.prop('background', _.get_grid_background(2, true));
        } else {
          css.prop('background', _.get_grid_background(2, false));
        }
        _.add_style(css);
      }
    },

    set_styles_to_grid_layout_14_15: function () {
      var _ = this;
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption, .tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-item-image .tgr-item-header');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);

      if(_.is_layout([15])){//14
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-grid .tgr-figcaption');
        css.prop('top', app.css_number(_.options.layout.borderWidth2, 'px'));
        css.prop('bottom', app.css_number(_.options.layout.borderWidth2, 'px'));
        css.prop('left', app.css_number(_.options.layout.borderWidth2, 'px'));
        css.prop('right', app.css_number(_.options.layout.borderWidth2, 'px'));
        _.add_style(css);
      }
    },

    set_list_styles: function () {
      var _ = this;

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-list .tgr-item');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }

      if(_.options.layout.list.borderBottomOnly){
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
      } else {
        css.prop('border', app.css_number(_.options.layout.borderWidth, 'px') + ' solid ' + _.options.layout.borderColor);
        css.prop('margin-bottom', '40px');
      }
      _.add_style(css);
    },

    set_table_styles: function () {

      var _ = this;

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table');
      if (_.options.layout.bgGradientEnabled) {
        css.prop('background', _.get_grid_background(1, true));
      } else {
        css.prop('background', _.get_grid_background(1, false));
      }
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table .tgr-th, .tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table .tgr-td');
      css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px') + ' 0');
      css.prop('border-color', _.options.layout.borderColor);
      _.add_style(css);

      if( _.options.layout.table.bordered ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table.tgr-table-bordered .tgr-th, .tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table.tgr-table-bordered .tgr-td');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css);

        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table.tgr-table-bordered .tgr-tr.tgr-item');
        css.prop('border-width', app.css_number(_.options.layout.borderWidth, 'px'));
        css.prop('border-color', _.options.layout.borderColor);
        _.add_style(css, '@media (max-width: '+_.options.breakpoints.tablet+'px)');
      }

      if( _.options.layout.table.striped ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table.tgr-table-striped .tgr-th, .tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table.tgr-table-striped .tgr-tr:nth-child(odd)');
        css.prop('background', _.options.layout.table.stripedColor);
        _.add_style(css);
      }

      if( _.options.layout.table.hover ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-layout-type-table .tgr-table.tgr-table-hover .tgr-tr.tgr-item:hover');
        css.prop('background', _.options.layout.table.hoverColor);
        _.add_style(css);
      }
    },

    set_displayer_styles: function () {
      var _ = this;

      //Text color
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer');
      css.prop('color', _.options.displayer.textColor);
      _.add_style(css);

      //Links
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-member.tgr-displayer a');
      css.prop('color', _.options.displayer.linkColor);
      _.add_style(css);

      //Font size
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer');
      css.prop('font-size', app.css_number(_.options.displayer.textSize, 'px'));
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer .tgr-member-title');
      css.prop('font-size', app.css_number(_.options.displayer.textSizeHeading1, 'px'));
      _.add_style(css);


      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer .tgr-member-role, .tgr-team-' + _.team_id + ' .tgr-displayer .tgr-member-social h4, .tgr-team-' + _.team_id + ' .tgr-displayer .tgr-member-fields h4, .tgr-team-' + _.team_id + ' .tgr-displayer .tgr-member-skills h4');
      css.prop('font-size', app.css_number(_.options.displayer.textSizeHeading2, 'px'));
      _.add_style(css);


      if(_.is_displayer_popup() || _.is_displayer_slide_in() ){
        _.set_popup_styles();
      } else if(_.is_displayer_inline() ){
        _.set_inline_styles();
      }
    },

    set_popup_styles: function () {
      var _ = this;

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-popup .tgr-popup .tgr-popup-content');
      css.prop('border-radius', app.css_number(_.options.displayer.popup.borderRadius, 'px'));
      css.prop('background-color', _.options.displayer.bgColor);
      _.add_style(css);

      if( _.is_displayer_slide_in() ){
        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-arrow.tgr-arrow-default .tgr-arrow-default-top, .tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-arrow.tgr-arrow-default .tgr-arrow-default-bottom, .tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-close.tgr-close-default .tgr-close-default-one, .tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-close.tgr-close-default .tgr-close-default-two');
        css.prop('background-color', _.options.displayer.controlsColor);
        _.add_style(css);

        var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-arrow.tgr-arrow-default .tgr-arrow-default-top:after, .tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-arrow.tgr-arrow-default .tgr-arrow-default-bottom:after, .tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-close.tgr-close-default .tgr-close-default-one:after, .tgr-team-' + _.team_id + ' .tgr-displayer-slide-in .tgr-close.tgr-close-default .tgr-close-default-two:after');
        css.prop('background-color', _.options.displayer.controlsColor);
        _.add_style(css);
      }
    },

    set_inline_styles: function () {
      var _ = this;

      var marginInlineLayout = _.options.layout.columnsGap / 2;
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-inline .tgr-displayer');
      css.prop('background-color', _.options.displayer.bgColor);
      css.prop('margin-top', app.css_number(_.options.displayer.inline.marginTop, 'px'));
      css.prop('margin-left', app.css_number(marginInlineLayout, 'px'));
      css.prop('width', 'calc(100% - '+app.css_number(_.options.layout.columnsGap, 'px')+')');
      css.prop('border-color', _.options.displayer.borderColor);
      css.prop('border-width', app.css_number(_.options.displayer.borderWidth, 'px'));
      var verticalPadding = app.parse_number(_.options.displayer.verticalPadding);
      var horizontalPadding = app.parse_number(_.options.displayer.horizontalPadding);
      var ws = app.window_size();
      if(ws.viewport.width <= _.options.breakpoints.mobile){//768
        verticalPadding = parseInt(Math.max(0, verticalPadding * 0.6));
        horizontalPadding = parseInt(Math.max(0, horizontalPadding * 0.6));
        if( _.options.displayer.borderWidth == 0 ){
          horizontalPadding = 5;
        }
      } else if(ws.viewport.width <= _.options.breakpoints.tablet){//834
        verticalPadding = parseInt(Math.max(0, verticalPadding * 0.8));
        horizontalPadding = parseInt(Math.max(0, horizontalPadding * 0.8));
        if( _.options.displayer.borderWidth == 0 ){
          horizontalPadding = 5;
        }
      }
      css.prop('padding', app.css_number(verticalPadding, 'px') +' '+app.css_number(horizontalPadding, 'px'));
      _.add_style(css);

      //Triángulo
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-inline .tgr-triangle-inline');
      css.prop('border-bottom-color', _.options.displayer.triangleColor);
      if( _.options.displayer.borderWidth == 0 ){
        css.prop('display', 'none');
      }
      _.add_style(css);

      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer-inline .tgr-close-inline:before, .tgr-team-' + _.team_id + ' .tgr-displayer-inline .tgr-close-inline:after');
      css.prop('background', _.options.displayer.controlsColor);
      _.add_style(css);

      //Scroll
      var css = new app.css('.tgr-team-' + _.team_id + ' .tgr-displayer .tgr-scroll.nano');
      css.prop('max-height', app.css_number(_.options.displayer.inline.height, 'px'));
      _.add_style(css);
    },

    show_popup: function () {
      var _ = this;
      setTimeout(function () {
        _.$popup.fadeIn(120);
      }, 80);//Evita que se muestre antes de tiempo
    },

    hide_popup: function () {
      this.$popup.hide();
    },

    has_overlay: function () {
      var _ = this;
      return _.find_overlay().length == 1 && _.options.displayer.popup.overlay.show;
    },

    show_overlay: function () {
      var _ = this;
      if (!_.has_overlay()) {
        return;
      }
      _.$overlay.fadeIn(app.parse_number(_.options.displayer.popup.overlay.durationIn));
    },

    close_overlay: function () {
      var _ = this;
      if (!_.has_overlay()) {
        return;
      }
      _.$overlay.fadeOut(app.parse_number(_.options.displayer.popup.overlay.durationOut));
    },

    disable_page_scroll: function (disable) {
      var _ = this;
      if (_.options.displayer.popup.disablePageScroll) {
        $('html').toggleClass('tgr-disable-page-scroll', disable);
      }
    },

    get_grid_item_id: function (index_or_target) {
      if (app.isjQuery(index_or_target)) {
        return this.find_grid_item_by_target(index_or_target).data('id');
      }
      return this.find_grid_item_by_index(index_or_target).data('id');
    },

    get_grid_item_index: function (id_or_target) {
      if (app.isjQuery(id_or_target)) {
        return this.find_grid_item_by_target(id_or_target).data('index');
      }
      return this.find_grid_item_by_id(id_or_target).data('index');
    },

    get_item_last_index: function () {
      return this.$items.length - 1;
    },

    find_grid_layout: function () {
      return this.$team.find('.tgr-layout-type-grid');
    },

    find_list_layout: function () {
      return this.$team.find('.tgr-layout-type-list');
    },

    find_table_layout: function () {
      return this.$team.find('.tgr-layout-type-table');
    },

    find_member_item: function (id) {
      if (id) {
        return this.find_displayer().find('.tgr-member-item[data-id=' + id + ']');
      }
      return this.find_displayer().find('.tgr-member-item');
    },

    find_grid_item_by_target: function ($target) {
      return $target.closest('.tgr-item');
    },

    find_grid_item_by_id: function (id) {
      return this.$box.find('.tgr-item[data-id="' + id + '"]');
    },

    find_grid_item_by_index: function (index) {
      return this.$box.find('.tgr-item[data-index="' + index + '"]');
    },

    find_grid_item_active: function () {
      return this.$box.find('.tgr-item.tgr-active');
    },

    find_displayer: function () {
      return $('body').find('.tgr-displayer-'+this.team_id);
    },

    find_displayer_inline: function () {
      return this.$box_wrap.filter('.tgr-displayer-inline').find('.tgr-displayer');
    },

    find_displayer_popup: function () {
      return $('body').find('.tgr-popup-'+this.team_id);
    },
    find_popup_content: function () {
      return this.find_displayer_popup().find('.tgr-popup-content');
    },
    find_overlay: function () {
      return this.find_displayer_popup().next('.tgr-overlay');
    },
    find_scroll: function () {
      return $('body').find('.tgr-displayer-'+this.team_id).find('.tgr-scroll');
    },

    is_open_popup: function () {
      return !!this.$popup.length && this.popup_is_open && $('body').hasClass('tgr-popup-is-open');
    },

    is_displayer_none: function () {
      return this.get_displayer_type() == 'none';
    },
    is_displayer_popup: function () {
      return this.get_displayer_type() == app.displayers.POPUP;
    },
    is_displayer_slide_in: function (position) {
      if (position) {
        return this.get_displayer_type() == position;
      }
      return this.get_displayer_type() == app.displayers.SLIDE_IN_LEFT || this.get_displayer_type() == app.displayers.SLIDE_IN_RIGHT;
    },
    is_displayer_inline: function () {
      return this.get_displayer_type() == app.displayers.INLINE;
    },

    get_displayer_type: function () {
      return this.options.displayer.type;
    },

    is_layout: function (layout_number) {
      if (app.isArray(layout_number)) {
        return layout_number.indexOf(parseInt(this.options.layout.number)) > -1;
      }
      return this.options.layout.number == layout_number;
    },
    is_layout_flip_card: function () {
      var _ = this;
      if (_.is_layout([13])) {//12
        return true;
      }
      //9,11
      if (_.is_layout([10, 12]) && _.options.layout.grid.description.visible == false) {
        return true;
      }
      return false;
    },
    is_layout_list: function () {
      return this.options.layout.type == 'list';
    },
    is_layout_table: function () {
      return this.options.layout.type == 'table';
    },

    hide_show_items: function (event, filter) {
      var _ = this;
      var $filter_btn = $(event.currentTarget);

      var filterItems = true;

      if (filter == 0) {
        _.set_all_filters();
      } else {
        _.$filter.find('[data-filter-id="0"]').removeClass('tgr-active-filter');//All
        if (_.clearSelectedFilters) {
          _.selected_filters = [];
          _.clearSelectedFilters = false;
        }
        var indexOf = _.selected_filters.indexOf(filter);
        if (_.options.filters.multipleChoice) {
          if (indexOf == -1) {
            _.selected_filters.push(filter);
          } else {
            $filter_btn.removeClass('tgr-active-filter');
            _.selected_filters.splice(indexOf, 1);
          }
          if (_.selected_filters.length == 0) {
            _.set_all_filters();
          } else {
            _.selected_filters.forEach(function (filter) {
              _.$filter.find('[data-filter-id="' + filter + '"]').addClass('tgr-active-filter');
            });
          }
        } else {
          //Single choice
          if ($filter_btn.hasClass('tgr-active-filter')) {
            filterItems = false;//No filtrar si se hace click sobre un filtro ya activo
          } else {
            _.selected_filters = [filter];
            $filter_btn.addClass('tgr-active-filter').siblings().removeClass('tgr-active-filter');
          }
        }
      }

      if (!filterItems) {
        return;
      }

      _.hide_items_with_effect();
      setTimeout(function () {
        _.show_items_with_effect(_.get_items_to_show(filter));
      }, _.options.filters.duration + 120);

      //Comprobamos si existen items visibles
      setTimeout(function () {
        if( _.$items.filter(':visible').length == 0 ){
          _.show_items_with_effect(_.get_items_to_show(filter));
        }
      }, _.options.filters.duration * 4);
      setTimeout(function () {
        if( _.$items.filter(':visible').length == 0 ){
          _.show_items_with_effect(_.get_items_to_show(filter));
        }
      }, _.options.filters.duration * 5);
    },

    hide_items_with_effect: function () {
      var _ = this;
      _.$items.filter(':visible').each(function (index, item) {
          $(item).animateCSS_TeamGrid(_.options.filters.outEffect, {
            delay: 0,
            duration: _.options.filters.duration,
            complete: function () {
              $(item).css('display', 'none');
            }
          });
      });
    },

    get_items_to_show: function (filter) {
      var _ = this;
      if( filter == 0 ){
        //Show all items
        return _.$items;
      }
      var $items_to_show = $();
      _.$items.each(function (index, item) {
        var $item = $(item);
        var filters = _.get_item_filters($item);
        _.selected_filters.forEach(function (filter, index) {
          if (filters.indexOf(filter) > -1) {
            $items_to_show.push(item);
          }
        });
      });
      return $items_to_show;
    },

    set_all_filters: function () {
      var _ = this;
      _.selected_filters = _.filters.all;
      _.clearSelectedFilters = true;
      _.$filter.find('[data-filter-id="0"]').addClass('tgr-active-filter').siblings().removeClass('tgr-active-filter');
    },

    array_items_to_show: function ($items_to_show) {
      var arr = [];
      $items_to_show.each(function (index, item) {
        arr.push($(item).data('id'));
      });
      return arr;
    },

    show_items_with_effect: function ($items_to_show) {
      var _ = this;
      $items_to_show.show().animateCSS_TeamGrid(_.options.filters.inEffect, {
        delay: 0,
        duration: _.options.filters.duration,
        complete: function ($item) {
        }
      });
    },

    get_item_filters: function ($item) {
      var _ = this;
      var item_filters = $item.data('filters');
      item_filters = app.removeSpacesCommaSeparated(item_filters);
      if( app.is_empty(item_filters) ){
        return [];
      }
      return item_filters.split(',');
    },

    init_scroll: function () {
      var _ = this;
      _.find_scroll().addClass('nano').nanoScroller({
        paneClass: 'nano-pane',
        contentClass: 'nano-content',
        sliderClass: 'nano-slider',
        iOSNativeScrolling: false,
        preventPageScrolling: false,
        alwaysVisible: true,
      });
    },

    destroy_scroll: function () {
      var _ = this;
      _.find_scroll().removeClass('nano').nanoScroller({ destroy: true });
      _.find_scroll().removeAttr('style');
      setTimeout(function(){
        _.find_scroll().find('.tgr-scroll-inside').removeAttr('style');
      }, 1000);
    },

    d: function (m1, m2) {
      var _ = this;
      if( _.team_id != 8304 ){
        return;
      }
      if( m2 != undefined ){
        console.log(m1, m2);
      } else {
        console.log(m1);
      }
    },

  };

  app.css = function(selector){
    this.selector = selector || '';
    this.props = {};
    this.prop = function(name, value){
      this.props[name] = value;
    };

    this.add_selector = function(selector){
      this.selector += ', '+selector;
    };

    this.render = function(props){
      return '<style>'+ this.build_css(props) +'</style>';
    };

    this.build_css = function(props, media_query){
      var style = this.get_inline_style(props);
      if( this.selector ){
        if( media_query ){
          return media_query + ' {' + this.selector + '{'+style+'} }';
        } else {
          return this.selector + '{'+style+'}';
        }
      }
      return style;
    };

    this.get_inline_style = function(props){
      this.props = props || this.props;
      var style = '';
      for( var key in this.props ){
        style += key + ': ' + this.props[key]+'; ';
      }
      return style;
    };
  };


  app.isCmdKey = function (e) {
    return !!e.ctrlKey || !!e.metaKey;//Mac support
  };

  app.removeAllSpaces = function (text) {
    if (text) {
      return text.replace(/ /g, '');
    }
    return text;
  };
  app.removeSpacesCommaSeparated = function (text) {
    if (text) {
      return text.replace(/\s*,\s*/g, ',')
    }
    return text;
  };
  app.arrayUnique = function (value, index, self) {
    return self.indexOf(value) === index;
  };

  app.is_empty = function (value) {
    if (value === undefined || value === null) {
      return true;
    } else if (typeof value == 'object') {
      if (app.isjQuery(value)) {
        return value.length === 0;
      } else {
        for (var i in value) return false;
        return true;
      }
    } else {
      return (value === false || $.trim(value).length === 0);
    }
  };

  app.is_url = function (url) {
    var pattern = new RegExp('^(https?:\\/\\/)?' + // protocol
      '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' + // domain name
      '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
      '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
      '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
      '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator
    return pattern.test(url);
  };

  app.is_email = function (email) {
    var re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return re.test(email);
  };

  app.scroll_to = function ($this, delay, offset, callback) {
    offset = offset >= 0 ? offset : 300;
    delay = delay || 650;
    $('html,body').stop().animate({ scrollTop: Math.abs($this.offset().top - offset) }, delay, 'swing', callback);
    return false;
  };

  app.in_scroll_top = function (value, compare) {
    compare = compare || '>=';
    var object = app.number_data(value);
    var n = app.parse_number(object.value);
    if (compare === '>=') {
      if (object.unit == '%') {
        return $(window).scrollTop() >= ($(document).height() - $(window).height()) * (n / 100);
      }
      return $(window).scrollTop() >= n;
    } else {
      if (object.unit == '%') {
        return $(window).scrollTop() <= ($(document).height() - $(window).height()) * (n / 100);
      }
      return $(window).scrollTop() <= n;
    }
  };

  app.in_scroll_element = function ($element, position, tolerance) {
    tolerance = tolerance || 0;
    position = position || 'top';
    var element_offset = $element.offset().top;
    var element_height = $element.outerHeight();
    var window_offset = $(window).scrollTop();
    var window_height = $(window).height();
    var diff = window_offset + window_height - element_offset;

    //Do not modify the tolerance for elements with small height
    if (element_height > 10) {
      tolerance = Math.max(0, Math.min(element_height - 1, tolerance));
    }

    if (window_offset > element_offset) {
      if (window_offset + tolerance > element_offset + element_height) {
        return false;
      } else {
        return true;
      }
    }

    if (position == 'bottom') {
      var max_scroll = $('body').height() - window_height;
      diff = diff - element_height;
      if (diff > tolerance || window_offset > max_scroll) {
        return true;
      }
      return false;
    } else {
      if (diff > tolerance) {
        return true;
      }
      return false;
    }
  };

  app.get_number_value = function (value, orientation) {
    var ws = app.window_size();
    var n = 1;
    orientation = orientation || 'horizontal';
    if (app.is_numeric(value)) {
      var object = app.number_data(value);
      n = object.value;
      if (object.unit == '%') {
        if (orientation == 'horizontal') {
          n = (object.value / 100) * ws.viewport.width;
        } else if (orientation == 'vertical') {
          n = (object.value / 100) * ws.viewport.height;
        }
      }
    }
    return app.parse_number(n);
  };

  app.number_data = function (value) {
    var number = {
      value: value,
      unit: undefined,
    };
    if (!value) {
      return number;
    }
    value = value.toString();
    if ($.inArray(value, ['auto', 'initial', 'inherit', 'normal']) > -1) {
      number.value = value;
      number.unit = undefined;
    } else if (value.indexOf('px') > -1) {
      number.value = value.replace('px', '');
      number.unit = 'px';
    } else if (value.indexOf('%') > -1) {
      number.value = value.replace('%', '');
      number.unit = '%';
    } else if (value.indexOf('em') > -1) {
      number.value = value.replace('em', '');
      number.unit = 'em';
    }
    return number;
  };

  app.in_mobile = function (browserWidth) {
    return app.window_size().viewport.width <= app.parse_number(browserWidth);
  };

  app.parse_number = function (n, defaultValue) {
    n = parseFloat(n);
    if (isFinite(n)) {
      return n;
    }
    defaultValue = defaultValue || 1;
    return defaultValue;
  };

  app.css_number = function (value, unit) {
    unit = unit || 'px';
    if (app.is_auto(value)) {
      return value;
    }
    if (app.is_numeric(value)) {
      var object = app.number_data(value);
      if( object.unit ){
        return object.value + object.unit;
      }
      return object.value + unit;
    }
    return '';
  };

  app.is_number = function (n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
  };

  app.is_numeric = function (n) {
    return !isNaN(parseInt(n));
  };

  app.is_auto = function (value) {
    return $.inArray(value, ['auto', 'initial', 'inherit', 'normal']) > -1;
  };

  app.viewport_size = function () {
    var e = window, a = 'inner';
    if (!('innerWidth' in window)) {
      a = 'client';
      e = document.documentElement || document.body;
    }
    return { width: e[a + 'Width'], height: e[a + 'Height'] };
  };

  app.window_size = function () {
    return {
      height: $(window).height(),
      width: $(window).width(),
      documentWidth: $(document).width(),
      documentHeight: $(document).height(),
      scrollTop: $(window).scrollTop(),
      scrollLeft: $(window).scrollLeft(),
      viewport: {
        width: app.viewport_size().width,
        height: app.viewport_size().height,
      },
    };
  };

  app.get_size_by_target = function ($target) {
    return !$target.length ? {} : {
      width: $target.width(),
      height: $target.height(),
      innerWidth: $target.innerWidth(),//with padding but without border
      innerHeight: $target.innerHeight(),//with padding but without border
      outerWidth: $target.outerWidth(true),//with padding, border and with margin if true
      outerHeight: $target.outerHeight(true),//with padding, border and with margin if true
      position: {
        top: $target.position().top,
        left: $target.position().left,
        bottom: parseInt($target.css('bottom')),
        right: parseInt($target.css('right'))
      },
      offset: {
        left: $target.offset().left,
        top: $target.offset().top,
      },
      padding: {
        top: app.parse_number($target.css('padding-top')),
        left: app.parse_number($target.css('padding-left')),
        right: app.parse_number($target.css('padding-right')),
        bottom: app.parse_number($target.css('padding-bottom')),
      },
      margin: {
        top: app.parse_number($target.css('margin-top')),
        left: app.parse_number($target.css('margin-left')),
        right: app.parse_number($target.css('margin-right')),
        bottom: app.parse_number($target.css('margin-bottom')),
      }
    };
  };

  app.getBrowserScrollbarWidth = function () {
    var outer, outerStyle, scrollbarWidth;
    outer = document.createElement('div');
    outerStyle = outer.style;
    outerStyle.position = 'absolute';
    outerStyle.width = '100px';
    outerStyle.height = '100px';
    outerStyle.overflow = 'scroll';
    outerStyle.top = '-9999px';
    document.body.appendChild(outer);
    scrollbarWidth = outer.offsetWidth - outer.clientWidth;
    document.body.removeChild(outer);
    return scrollbarWidth;
  };

  app.add_link_rel_google_font = function ($target, value) {
    if ($.inArray(value, TGR_PUBLIC_JS.google_fonts) > -1) {
      value = value.replace(/\s+/g, '+');
      $target.append('<link href="//fonts.googleapis.com/css?family=' + value + ':100,200,300,400,500,600,700,800,900&subset=latin,latin-ext,greek,greek-ext,cyrillic,cyrillic-ext,vietnamese"  rel="stylesheet" type="text/css">');
    }
  };

  app.truncateString = function (string, max, ending) {
    max = max +1;
    ending = ending === undefined ? '...' : ending;
    // string = "<span class='className'>My long string that</span> I want shorter<span> but just a little bit</span>"

    var noHTML = string.replace(/<[^>]*>/g, '');

    // if the string does not need to be truncated
    if (noHTML.length <= max){
      return string;
    }

    // if the string does not contains tags
    if (noHTML.length === string.length){
      // add <span title=""> to allow complete string to appear on hover
      return string.substring(0, max).trim();
    }

    var substrings =  string.split(/(<[^>]*>)/g).filter(Boolean);
    // substrings = ["<span class='className'>","My long string that","</span>"," I want shorter","<span>"," but just a little bit","</span>"]

    var count = 0;
    var truncated = [];
    for (var i = 0; i < substrings.length; i++) {
      var substr = substrings[i];
      // if the substring isn't an HTML tag
      if (! substr.startsWith("<")){
        if (count > max){
          continue;
        } else if (substr.length > (max-count-1)){
          truncated.push(substr.substring(0, (max-count) - 1)+ ending);
        } else {
          truncated.push(substr);
        }
        count += substr.length;
      } else {
        truncated.push(substr);
      }
    }
    return truncated.join("");
  };

  app.isArray = function (obj) {
    return !!obj && obj.constructor === Array;
  };

  app.isObject = function (obj) {
    return !!obj && obj.constructor === Object;
  };

  app.isActiveSlideEffect = function () {
    return jQuery.effects != undefined && jQuery.effects.effect.slide != undefined;
  };

  app.redirect = function (url, target, delay) {
    delay = delay || 0;
    target = target || '_self';
    if (url && url != 'http://' && url != '#') {
      if (target == '_blank') {
        if (delay === 0) {
          window.open(url, target);
        } else {
          setTimeout(function () {
            window.open(url, target);
          }, delay);
        }
      } else {
        if (delay === 0) {
          window.location = url;
        } else {
          setTimeout(function () {
            window.location = url;
          }, delay);
        }
      }
    }
  };

  app.isjQuery = function (obj) {
    return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
  };

  app.get_instance = function (team_id, instance_id) {
    var $team = app.find_team(team_id);
    if( instance_id ){
      $team = $team.filter('[data-instance-id='+instance_id+']');
    }
    return $team.first().data('TeamGrid');
  };

  app.find_team = function (team_id) {
    var $team;
    if (app.isjQuery(team_id)) {
      if (team_id.hasClass('tgr-team')) {
        $team = team_id;
      } else {
        $team = team_id.closest('.tgr-team');
      }
    } else {
      $team = $('.tgr-team.tgr-team-' + team_id);
    }
    return $team;
  };

  app.ajax = function (options) {
    var defaults = {
      type: 'post',
      data: {
        ajax_nonce: TGR_PUBLIC_JS.ajax_nonce,
      },
      dataType: 'json',
      beforeSend: function () {
      },
      success: function (response) {
      },
      complete: function (jqXHR, textStatus) {
      },
    };
    options = $.extend(true, {}, defaults, options);

    //Debug
    clog('==================== AJAX PROCESS ====================');
    clog('Options: ', options );

    $.ajax({
      url: TGR_PUBLIC_JS.ajax_url,
      type: options.type,
      dataType: options.dataType,
      data: options.data,
      beforeSend: options.beforeSend,
      success: function (response) {
        clog('====== AJAX SUCCESS:  ========');
        clog(response);
        if ($.isFunction(options.success)) {
          options.success.call(this, response);
        }
      },
      error: function (jqXHR, textStatus, errorThrown) {
        clog('====== AJAX ERROR:  ========');
        clog('jqXHR');
        clog(jqXHR);
        clog('errorThrown');
        clog(errorThrown);
      },
      complete: function (jqXHR, textStatus) {
        if ($.isFunction(options.complete)) {
          options.complete.call(this, jqXHR, textStatus);
        }
      }
    });
  };

  //Plugin jQuery TeamGrid
  $.fn.TeamGrid = function (options) {
    return this.each(function () {
      var id = $(this).data('id');
      if (app.is_empty(options) && TGR_TEAMS[id] ) {
        options = TGR_TEAMS[id];
      }

      if( app.is_empty(options) ){
        return;
      }

      var instance = $(this).data('TeamGrid');
      if($(this).hasClass('tgr-design')) {
        $(this).data('TeamGrid', new TeamGrid(this, options));
      } else if($(this).hasClass('tgr-filter-design')) {
        $(this).data('TeamGrid', new TeamGrid(this, options));
      } else if (instance) {
        options.refresh = true;
        instance.init(options);
      }  else {
        //For when a new Team is being created
        if( id == 0 ){
          options.refresh = true;
        }
        $(this).data('TeamGrid', new TeamGrid(this, options));
      }
    });
  };

  //Debug
  function c(msg) {
    console.log(msg);
  }

  function cc(msg, msg2) {
    console.log(msg, msg2);
  }

  function clog(msg, msg2) {
    if (app.debug) {
      if( msg2 ){
        console.log(msg, msg2);
      } else {
        console.log(msg);
      }
    }
  }

  return app;

})(jQuery, window, document);



// $(document).on('click', 'ul.ult_tabmenu > li', function(){
//   var index = $(this).index();
//   var $tabcontent = $('.ult_tab_min_contain > div').eq(index);
//   var $team = $tabcontent.find('.tgr-team');
//   //console.log("$team", $team);
//   $team.TeamGrid();
// });
// source --> https://maternity.hu/wp-content/plugins/team-grid/libs/jquery.animatecss/jquery.animatecss.js?ver=1.3.2 
//
// jquery.animatecss.js - A micro-plugin for using Animate.css with jQuery.
//
// Developed by Cory LaViska for A Beautiful Site, LLC
//
// Licensed under the MIT license: http://opensource.org/licenses/MIT
//
(function(factory) {
  if(typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['jquery'], factory);
  } else if(typeof module === 'object' && module.exports) {
    // Node/CommonJS
    module.exports = function(root, jQuery) {
      if(jQuery === undefined) {
        if(typeof window !== 'undefined') {
          jQuery = require('jquery');
        } else {
          jQuery = require('jquery')(root);
        }
      }
      factory(jQuery);
      return jQuery;
    };
  } else {
    // Browser globals
    factory(jQuery);
  }
}(function($) {
  'use strict';

  function animate(el, options) {
    var animationEnd = 'animationend mozAnimationEnd MSAnimationEnd oanimationend webkitAnimationEnd';

    $(el)
      .addClass('tgr-animated ' + options.animation)
      // .one() doesn't seem to work as reliably as .on() + .off()
      .on(animationEnd, function() {
        $(this).off(animationEnd);

        // Remove classes when animation ends
        if( !options.infinite ){
          $(el).removeClass('tgr-animated ' + options.animation);
        }

        // Run complete callback
        options.complete.call(el, $(el));
      });
  }

  $.fn.animateCSS_TeamGrid = function(animation) {
    var options = {};

    // Detect signature
    if(typeof arguments[1] === 'object') {
      // $(el).animateCSS('animation', options)
      options = arguments[1];
    } else if(typeof arguments[1] === 'function') {
      // $(el).animateCSS('animation', complete)
      options.complete = arguments[1];
    } else if(typeof arguments[1] === 'number') {
      // $(el).animateCSS('animation', duration, [complete])
      options.duration = arguments[1];
      if(typeof arguments[2] === 'function') options.complete = arguments[2];
    }

    // Merge options with defaults
    options = $.extend(true, {
      animation: animation,
      complete: function() {},
      delay: 0,
      duration: 1000,
      infinite: false,
    }, options);

    // Apply animation to each element
    $(this).each(function() {
      var el = this;

      // Set duration
      if(options.duration) {
        $(el).css({
          '-moz-animation-duration': options.duration + 'ms',
          '-o-animation-duration': options.duration + 'ms',
          '-webkit-animation-duration': options.duration + 'ms',
          'animation-duration': options.duration + 'ms'
        });
      }

      // Animate it
      if(options.delay <= 0) {
        //
        // Note: using setTimeout with a zero duration causes execution to wait for the next tick,
        // resulting in a minor performance issue. For example, the following would result in a
        // quick visual blip in some browsers after the element is made visible but before
        // animation starts:
        //
        //  $(el).property('hidden', false).animateCSS('slideInUp')
        //
        // This is why we don't use setTimeout when no delay is desired.
        //
        animate(el, options);
      } else {
        // Delay before animating
        setTimeout(function() {
          animate(el, options);
        }, options.delay);
      }
    });

    return this;
  };
}));
// source --> https://maternity.hu/wp-content/plugins/team-grid/libs/nanoScrollerJS/jquery.nanoscroller.js?ver=1.3.2 
/*! nanoScrollerJS - v0.8.7 - 2015
* http://jamesflorentino.github.com/nanoScrollerJS/
* Copyright (c) 2015 James Florentino; Licensed MIT */
(function(factory) {
  if (typeof define === 'function' && define.amd) {
    return define(['jquery'], function($) {
      return factory($, window, document);
    });
  } else if (typeof exports === 'object') {
    return module.exports = factory(require('jquery'), window, document);
  } else {
    return factory(jQuery, window, document);
  }
})(function($, window, document) {
  "use strict";
  var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, ENTER, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEENTER, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, cAF, defaults, getBrowserScrollbarWidth, hasTransform, isFFWithBuggyScrollbar, rAF, transform, _elementStyle, _prefixStyle, _vendor;
  defaults = {

    /**
      a classname for the pane element.
      @property paneClass
      @type String
      @default 'nano-pane'
     */
    paneClass: 'nano-pane',

    /**
      a classname for the slider element.
      @property sliderClass
      @type String
      @default 'nano-slider'
     */
    sliderClass: 'nano-slider',

    /**
      a classname for the content element.
      @property contentClass
      @type String
      @default 'nano-content'
     */
    contentClass: 'nano-content',

    /**
      a setting to enable native scrolling in iOS devices.
      @property iOSNativeScrolling
      @type Boolean
      @default false
     */
    iOSNativeScrolling: false,

    /**
      a setting to prevent the rest of the page being
      scrolled when user scrolls the `.content` element.
      @property preventPageScrolling
      @type Boolean
      @default false
     */
    preventPageScrolling: false,

    /**
      a setting to disable binding to the resize event.
      @property disableResize
      @type Boolean
      @default false
     */
    disableResize: false,

    /**
      a setting to make the scrollbar always visible.
      @property alwaysVisible
      @type Boolean
      @default false
     */
    alwaysVisible: false,

    /**
      a default timeout for the `flash()` method.
      @property flashDelay
      @type Number
      @default 1500
     */
    flashDelay: 1500,

    /**
      a minimum height for the `.slider` element.
      @property sliderMinHeight
      @type Number
      @default 20
     */
    sliderMinHeight: 20,

    /**
      a maximum height for the `.slider` element.
      @property sliderMaxHeight
      @type Number
      @default null
     */
    sliderMaxHeight: null,

    /**
      an alternate document context.
      @property documentContext
      @type Document
      @default null
     */
    documentContext: null,

    /**
      an alternate window context.
      @property windowContext
      @type Window
      @default null
     */
    windowContext: null
  };

  /**
    @property SCROLLBAR
    @type String
    @static
    @final
    @private
   */
  SCROLLBAR = 'scrollbar';

  /**
    @property SCROLL
    @type String
    @static
    @final
    @private
   */
  SCROLL = 'scroll';

  /**
    @property MOUSEDOWN
    @type String
    @final
    @private
   */
  MOUSEDOWN = 'mousedown';

  /**
    @property MOUSEENTER
    @type String
    @final
    @private
   */
  MOUSEENTER = 'mouseenter';

  /**
    @property MOUSEMOVE
    @type String
    @static
    @final
    @private
   */
  MOUSEMOVE = 'mousemove';

  /**
    @property MOUSEWHEEL
    @type String
    @final
    @private
   */
  MOUSEWHEEL = 'mousewheel';

  /**
    @property MOUSEUP
    @type String
    @static
    @final
    @private
   */
  MOUSEUP = 'mouseup';

  /**
    @property RESIZE
    @type String
    @final
    @private
   */
  RESIZE = 'resize';

  /**
    @property DRAG
    @type String
    @static
    @final
    @private
   */
  DRAG = 'drag';

  /**
    @property ENTER
    @type String
    @static
    @final
    @private
   */
  ENTER = 'enter';

  /**
    @property UP
    @type String
    @static
    @final
    @private
   */
  UP = 'up';

  /**
    @property PANEDOWN
    @type String
    @static
    @final
    @private
   */
  PANEDOWN = 'panedown';

  /**
    @property DOMSCROLL
    @type String
    @static
    @final
    @private
   */
  DOMSCROLL = 'DOMMouseScroll';

  /**
    @property DOWN
    @type String
    @static
    @final
    @private
   */
  DOWN = 'down';

  /**
    @property WHEEL
    @type String
    @static
    @final
    @private
   */
  WHEEL = 'wheel';

  /**
    @property KEYDOWN
    @type String
    @static
    @final
    @private
   */
  KEYDOWN = 'keydown';

  /**
    @property KEYUP
    @type String
    @static
    @final
    @private
   */
  KEYUP = 'keyup';

  /**
    @property TOUCHMOVE
    @type String
    @static
    @final
    @private
   */
  TOUCHMOVE = 'touchmove';

  /**
    @property BROWSER_IS_IE7
    @type Boolean
    @static
    @final
    @private
   */
  BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject;

  /**
    @property BROWSER_SCROLLBAR_WIDTH
    @type Number
    @static
    @default null
    @private
   */
  BROWSER_SCROLLBAR_WIDTH = null;
  rAF = window.requestAnimationFrame;
  cAF = window.cancelAnimationFrame;
  _elementStyle = document.createElement('div').style;
  _vendor = (function() {
    var i, transform, vendor, vendors, _i, _len;
    vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'];
    for (i = _i = 0, _len = vendors.length; _i < _len; i = ++_i) {
      vendor = vendors[i];
      transform = vendors[i] + 'ransform';
      if (transform in _elementStyle) {
        return vendors[i].substr(0, vendors[i].length - 1);
      }
    }
    return false;
  })();
  _prefixStyle = function(style) {
    if (_vendor === false) {
      return false;
    }
    if (_vendor === '') {
      return style;
    }
    return _vendor + style.charAt(0).toUpperCase() + style.substr(1);
  };
  transform = _prefixStyle('transform');
  hasTransform = transform !== false;

  /**
    Returns browser's native scrollbar width
    @method getBrowserScrollbarWidth
    @return {Number} the scrollbar width in pixels
    @static
    @private
   */
  getBrowserScrollbarWidth = function() {
    var outer, outerStyle, scrollbarWidth;
    outer = document.createElement('div');
    outerStyle = outer.style;
    outerStyle.position = 'absolute';
    outerStyle.width = '100px';
    outerStyle.height = '100px';
    outerStyle.overflow = SCROLL;
    outerStyle.top = '-9999px';
    document.body.appendChild(outer);
    scrollbarWidth = outer.offsetWidth - outer.clientWidth;
    document.body.removeChild(outer);
    return scrollbarWidth;
  };
  isFFWithBuggyScrollbar = function() {
    var isOSXFF, ua, version;
    ua = window.navigator.userAgent;
    isOSXFF = /(?=.+Mac OS X)(?=.+Firefox)/.test(ua);
    if (!isOSXFF) {
      return false;
    }
    version = /Firefox\/\d{2}\./.exec(ua);
    if (version) {
      version = version[0].replace(/\D+/g, '');
    }
    return isOSXFF && +version > 23;
  };

  /**
    @class NanoScroll
    @param element {HTMLElement|Node} the main element
    @param options {Object} nanoScroller's options
    @constructor
   */
  NanoScroll = (function() {
    function NanoScroll(el, options) {
      this.el = el;
      this.options = options;
      BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth());
      this.$el = $(this.el);
      this.doc = $(this.options.documentContext || document);
      this.win = $(this.options.windowContext || window);
      this.body = this.doc.find('body');
      this.$content = this.$el.children("." + this.options.contentClass);
      this.$content.attr('tabindex', this.options.tabIndex || 0);
      this.content = this.$content[0];
      this.previousPosition = 0;
      if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) {
        this.nativeScrolling();
      } else {
        this.generate();
      }
      this.createEvents();
      this.addEvents();
      this.reset();
    }


    /**
      Prevents the rest of the page being scrolled
      when user scrolls the `.nano-content` element.
      @method preventScrolling
      @param event {Event}
      @param direction {String} Scroll direction (up or down)
      @private
     */

    NanoScroll.prototype.preventScrolling = function(e, direction) {
      if (!this.isActive) {
        return;
      }
      if (e.type === DOMSCROLL) {
        if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) {
          e.preventDefault();
        }
      } else if (e.type === MOUSEWHEEL) {
        if (!e.originalEvent || !e.originalEvent.wheelDelta) {
          return;
        }
        if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) {
          e.preventDefault();
        }
      }
    };


    /**
      Enable iOS native scrolling
      @method nativeScrolling
      @private
     */

    NanoScroll.prototype.nativeScrolling = function() {
      this.$content.css({
        WebkitOverflowScrolling: 'touch'
      });
      this.iOSNativeScrolling = true;
      this.isActive = true;
    };


    /**
      Updates those nanoScroller properties that
      are related to current scrollbar position.
      @method updateScrollValues
      @private
     */

    NanoScroll.prototype.updateScrollValues = function() {
      var content, direction;
      content = this.content;
      this.maxScrollTop = content.scrollHeight - content.clientHeight;
      this.prevScrollTop = this.contentScrollTop || 0;
      this.contentScrollTop = content.scrollTop;
      direction = this.contentScrollTop > this.previousPosition ? "down" : this.contentScrollTop < this.previousPosition ? "up" : "same";
      this.previousPosition = this.contentScrollTop;
      if (direction !== "same") {
        this.$el.trigger('update', {
          position: this.contentScrollTop,
          maximum: this.maxScrollTop,
          direction: direction
        });
      }
      if (!this.iOSNativeScrolling) {
        this.maxSliderTop = this.paneHeight - this.sliderHeight;
        this.sliderTop = this.maxScrollTop === 0 ? 0 : this.contentScrollTop * this.maxSliderTop / this.maxScrollTop;
      }
    };


    /**
      Updates CSS styles for current scroll position.
      Uses CSS 2d transfroms and `window.requestAnimationFrame` if available.
      @method setOnScrollStyles
      @private
     */

    NanoScroll.prototype.setOnScrollStyles = function() {
      var cssValue;
      if (hasTransform) {
        cssValue = {};
        cssValue[transform] = "translate(0, " + this.sliderTop + "px)";
      } else {
        cssValue = {
          top: this.sliderTop
        };
      }
      if (rAF) {
        if (cAF && this.scrollRAF) {
          cAF(this.scrollRAF);
        }
        this.scrollRAF = rAF((function(_this) {
          return function() {
            _this.scrollRAF = null;
            return _this.slider.css(cssValue);
          };
        })(this));
      } else {
        this.slider.css(cssValue);
      }
    };


    /**
      Creates event related methods
      @method createEvents
      @private
     */

    NanoScroll.prototype.createEvents = function() {
      this.events = {
        down: (function(_this) {
          return function(e) {
            _this.isBeingDragged = true;
            _this.offsetY = e.pageY - _this.slider.offset().top;
            if (!_this.slider.is(e.target)) {
              _this.offsetY = 0;
            }
            _this.pane.addClass('active');
            _this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]);
            _this.body.bind(MOUSEENTER, _this.events[ENTER]);
            return false;
          };
        })(this),
        drag: (function(_this) {
          return function(e) {
            _this.sliderY = e.pageY - _this.$el.offset().top - _this.paneTop - (_this.offsetY || _this.sliderHeight * 0.5);
            _this.scroll();
            if (_this.contentScrollTop >= _this.maxScrollTop && _this.prevScrollTop !== _this.maxScrollTop) {
              _this.$el.trigger('scrollend');
            } else if (_this.contentScrollTop === 0 && _this.prevScrollTop !== 0) {
              _this.$el.trigger('scrolltop');
            }
            return false;
          };
        })(this),
        up: (function(_this) {
          return function(e) {
            _this.isBeingDragged = false;
            _this.pane.removeClass('active');
            _this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]);
            _this.body.unbind(MOUSEENTER, _this.events[ENTER]);
            return false;
          };
        })(this),
        resize: (function(_this) {
          return function(e) {
            _this.reset();
          };
        })(this),
        panedown: (function(_this) {
          return function(e) {
            _this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5);
            _this.scroll();
            _this.events.down(e);
            return false;
          };
        })(this),
        scroll: (function(_this) {
          return function(e) {
            _this.updateScrollValues();
            if (_this.isBeingDragged) {
              return;
            }
            if (!_this.iOSNativeScrolling) {
              _this.sliderY = _this.sliderTop;
              _this.setOnScrollStyles();
            }
            if (e == null) {
              return;
            }
            if (_this.contentScrollTop >= _this.maxScrollTop) {
              if (_this.options.preventPageScrolling) {
                _this.preventScrolling(e, DOWN);
              }
              if (_this.prevScrollTop !== _this.maxScrollTop) {
                _this.$el.trigger('scrollend');
              }
            } else if (_this.contentScrollTop === 0) {
              if (_this.options.preventPageScrolling) {
                _this.preventScrolling(e, UP);
              }
              if (_this.prevScrollTop !== 0) {
                _this.$el.trigger('scrolltop');
              }
            }
          };
        })(this),
        wheel: (function(_this) {
          return function(e) {
            var delta;
            if (e == null) {
              return;
            }
            delta = e.delta || e.wheelDelta || (e.originalEvent && e.originalEvent.wheelDelta) || -e.detail || (e.originalEvent && -e.originalEvent.detail);
            if (delta) {
              _this.sliderY += -delta / 3;
            }
            _this.scroll();
            return false;
          };
        })(this),
        enter: (function(_this) {
          return function(e) {
            var _ref;
            if (!_this.isBeingDragged) {
              return;
            }
            if ((e.buttons || e.which) !== 1) {
              return (_ref = _this.events)[UP].apply(_ref, arguments);
            }
          };
        })(this)
      };
    };


    /**
      Adds event listeners with jQuery.
      @method addEvents
      @private
     */

    NanoScroll.prototype.addEvents = function() {
      var events;
      this.removeEvents();
      events = this.events;
      if (!this.options.disableResize) {
        this.win.bind(RESIZE, events[RESIZE]);
      }
      if (!this.iOSNativeScrolling) {
        this.slider.bind(MOUSEDOWN, events[DOWN]);
        this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]);
      }
      this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
    };


    /**
      Removes event listeners with jQuery.
      @method removeEvents
      @private
     */

    NanoScroll.prototype.removeEvents = function() {
      var events;
      events = this.events;
      this.win.unbind(RESIZE, events[RESIZE]);
      if (!this.iOSNativeScrolling) {
        this.slider.unbind();
        this.pane.unbind();
      }
      this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]);
    };


    /**
      Generates nanoScroller's scrollbar and elements for it.
      @method generate
      @chainable
      @private
     */

    NanoScroll.prototype.generate = function() {
      var contentClass, cssRule, currentPadding, options, pane, paneClass, sliderClass;
      options = this.options;
      paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass;
      if (!(pane = this.$el.children("." + paneClass)).length && !pane.children("." + sliderClass).length) {
        this.$el.append("<div class=\"" + paneClass + "\"><div class=\"" + sliderClass + "\" /></div>");
      }
      this.pane = this.$el.children("." + paneClass);
      this.slider = this.pane.find("." + sliderClass);
      if (BROWSER_SCROLLBAR_WIDTH === 0 && isFFWithBuggyScrollbar()) {
        currentPadding = window.getComputedStyle(this.content, null).getPropertyValue('padding-right').replace(/[^0-9.]+/g, '');
        cssRule = {
          right: -14,
          paddingRight: +currentPadding + 14
        };
      } else if (BROWSER_SCROLLBAR_WIDTH) {
        cssRule = {
          right: -BROWSER_SCROLLBAR_WIDTH
        };
        this.$el.addClass('has-scrollbar');
      }
      if (cssRule != null) {
        this.$content.css(cssRule);
      }
      return this;
    };


    /**
      @method restore
      @private
     */

    NanoScroll.prototype.restore = function() {
      this.stopped = false;
      if (!this.iOSNativeScrolling) {
        this.pane.show();
      }
      this.addEvents();
    };


    /**
      Resets nanoScroller's scrollbar.
      @method reset
      @chainable
      @example
          $(".nano").nanoScroller();
     */

    NanoScroll.prototype.reset = function() {
      var content, contentHeight, contentPosition, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, parentMaxHeight, right, sliderHeight;
      if (this.iOSNativeScrolling) {
        this.contentHeight = this.content.scrollHeight;
        return;
      }
      if (!this.$el.find("." + this.options.paneClass).length) {
        this.generate().stop();
      }
      if (this.stopped) {
        this.restore();
      }
      content = this.content;
      contentStyle = content.style;
      contentStyleOverflowY = contentStyle.overflowY;
      if (BROWSER_IS_IE7) {
        this.$content.css({
          height: this.$content.height()
        });
      }
      contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH;
      parentMaxHeight = parseInt(this.$el.css("max-height"), 10);
      if (parentMaxHeight > 0) {
        this.$el.height("");
        this.$el.height(content.scrollHeight > parentMaxHeight ? parentMaxHeight : content.scrollHeight);
      }
      paneHeight = this.pane.outerHeight(false);
      paneTop = parseInt(this.pane.css('top'), 10);
      paneBottom = parseInt(this.pane.css('bottom'), 10);
      paneOuterHeight = paneHeight + paneTop + paneBottom;
      sliderHeight = Math.round(paneOuterHeight / contentHeight * paneHeight);
      if (sliderHeight < this.options.sliderMinHeight) {
        sliderHeight = this.options.sliderMinHeight;
      } else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) {
        sliderHeight = this.options.sliderMaxHeight;
      }
      if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) {
        sliderHeight += BROWSER_SCROLLBAR_WIDTH;
      }
      this.maxSliderTop = paneOuterHeight - sliderHeight;
      this.contentHeight = contentHeight;
      this.paneHeight = paneHeight;
      this.paneOuterHeight = paneOuterHeight;
      this.sliderHeight = sliderHeight;
      this.paneTop = paneTop;
      this.slider.height(sliderHeight);
      this.events.scroll();
      this.pane.show();
      this.isActive = true;
      if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) {
        this.pane.hide();
        this.isActive = false;
      } else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) {
        this.slider.hide();
      } else {
        this.slider.show();
      }
      this.pane.css({
        opacity: (this.options.alwaysVisible ? 1 : ''),
        visibility: (this.options.alwaysVisible ? 'visible' : '')
      });
      contentPosition = this.$content.css('position');
      if (contentPosition === 'static' || contentPosition === 'relative') {
        right = parseInt(this.$content.css('right'), 10);
        if (right) {
          this.$content.css({
            right: '',
            marginRight: right
          });
        }
      }
      return this;
    };


    /**
      @method scroll
      @private
      @example
          $(".nano").nanoScroller({ scroll: 'top' });
     */

    NanoScroll.prototype.scroll = function() {
      if (!this.isActive) {
        return;
      }
      this.sliderY = Math.max(0, this.sliderY);
      this.sliderY = Math.min(this.maxSliderTop, this.sliderY);
      this.$content.scrollTop(this.maxScrollTop * this.sliderY / this.maxSliderTop);
      if (!this.iOSNativeScrolling) {
        this.updateScrollValues();
        this.setOnScrollStyles();
      }
      return this;
    };


    /**
      Scroll at the bottom with an offset value
      @method scrollBottom
      @param offsetY {Number}
      @chainable
      @example
          $(".nano").nanoScroller({ scrollBottom: value });
     */

    NanoScroll.prototype.scrollBottom = function(offsetY) {
      if (!this.isActive) {
        return;
      }
      this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL);
      this.stop().restore();
      return this;
    };


    /**
      Scroll at the top with an offset value
      @method scrollTop
      @param offsetY {Number}
      @chainable
      @example
          $(".nano").nanoScroller({ scrollTop: value });
     */

    NanoScroll.prototype.scrollTop = function(offsetY) {
      if (!this.isActive) {
        return;
      }
      this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL);
      this.stop().restore();
      return this;
    };


    /**
      Scroll to an element
      @method scrollTo
      @param node {Node} A node to scroll to.
      @chainable
      @example
          $(".nano").nanoScroller({ scrollTo: $('#a_node') });
     */

    NanoScroll.prototype.scrollTo = function(node) {
      if (!this.isActive) {
        return;
      }
      this.scrollTop(this.$el.find(node).get(0).offsetTop);
      return this;
    };


    /**
      To stop the operation.
      This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI.
      @method stop
      @chainable
      @example
          $(".nano").nanoScroller({ stop: true });
     */

    NanoScroll.prototype.stop = function() {
      if (cAF && this.scrollRAF) {
        cAF(this.scrollRAF);
        this.scrollRAF = null;
      }
      this.stopped = true;
      this.removeEvents();
      if (!this.iOSNativeScrolling) {
        this.pane.hide();
      }
      return this;
    };


    /**
      Destroys nanoScroller and restores browser's native scrollbar.
      @method destroy
      @chainable
      @example
          $(".nano").nanoScroller({ destroy: true });
     */

    NanoScroll.prototype.destroy = function() {
      if (!this.stopped) {
        this.stop();
      }
      if (!this.iOSNativeScrolling && this.pane.length) {
        this.pane.remove();
      }
      if (BROWSER_IS_IE7) {
        this.$content.height('');
      }
      this.$content.removeAttr('tabindex');
      if (this.$el.hasClass('has-scrollbar')) {
        this.$el.removeClass('has-scrollbar');
        this.$content.css({
          right: ''
        });
      }
      return this;
    };


    /**
      To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s).
      Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him.
      @method flash
      @chainable
      @example
          $(".nano").nanoScroller({ flash: true });
     */

    NanoScroll.prototype.flash = function() {
      if (this.iOSNativeScrolling) {
        return;
      }
      if (!this.isActive) {
        return;
      }
      this.reset();
      this.pane.addClass('flashed');
      setTimeout((function(_this) {
        return function() {
          _this.pane.removeClass('flashed');
        };
      })(this), this.options.flashDelay);
      return this;
    };

    return NanoScroll;

  })();
  $.fn.nanoScroller = function(settings) {
    return this.each(function() {
      var options, scrollbar;
      if (!(scrollbar = this.nanoscroller)) {
        options = $.extend({}, defaults, settings);
        this.nanoscroller = scrollbar = new NanoScroll(this, options);
      }
      if (settings && typeof settings === "object") {
        $.extend(scrollbar.options, settings);
        if (settings.scrollBottom != null) {
          return scrollbar.scrollBottom(settings.scrollBottom);
        }
        if (settings.scrollTop != null) {
          return scrollbar.scrollTop(settings.scrollTop);
        }
        if (settings.scrollTo) {
          return scrollbar.scrollTo(settings.scrollTo);
        }
        if (settings.scroll === 'bottom') {
          return scrollbar.scrollBottom(0);
        }
        if (settings.scroll === 'top') {
          return scrollbar.scrollTop(0);
        }
        if (settings.scroll && settings.scroll instanceof $) {
          return scrollbar.scrollTo(settings.scroll);
        }
        if (settings.stop) {
          return scrollbar.stop();
        }
        if (settings.destroy) {
          return scrollbar.destroy();
        }
        if (settings.flash) {
          return scrollbar.flash();
        }
      }
      return scrollbar.reset();
    });
  };
  $.fn.nanoScroller.Constructor = NanoScroll;
});