//* Requires JQuery *//

/* Javascript polyfills */

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
    "use strict";
    if (this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;

    if (len === 0) {
      return -1;
    }
    var n = 0;
    if (arguments.length > 1) {
      n = Number(arguments[1]);
      if (n != n) { // shortcut for verifying if it's NaN
        n = 0;
      } else if (n !== 0 && n != Infinity && n != -Infinity) {
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
      }
    }
    if (n >= len) {
      return -1;
    }
    var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
    for (; k < len; k++) {
      if (k in t && t[k] === searchElement) {
        return k;
      }
    }
    return -1;
  };
}

/**
 * String.prototype.padStart() polyfill
 * https://github.com/uxitten/polyfill/blob/master/string.polyfill.js
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
 */
if (!String.prototype.padStart) {
	String.prototype.padStart = function padStart(targetLength,padString) {
		targetLength = targetLength>>0; //truncate if number or convert non-number to 0;
		padString = String((typeof padString !== 'undefined' ? padString : ' '));
		if (this.length > targetLength) {
			return String(this);
		}
		else {
			targetLength = targetLength-this.length;
			if (targetLength > padString.length) {
				padString += padString.repeat(targetLength/padString.length); //append to original to ensure we are longer than needed
			}
			return padString.slice(0,targetLength) + String(this);
		}
	};
}

/*
  IE Doesn't have a .startsWith either?
*/
if (!String.prototype.startsWith) {
  String.prototype.startsWith = function (str){
    return this.lastIndexOf(str, 0) === 0;
  };
}

// IE < 9 doesn't have a trim() for strings
if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, '');
  };
}
/* Javascript polyfills END */

/* event propagation stop */
try {
    function eventStopPropagation(event) {
        if (event.stopPropagation) {
            event.stopPropagation();   // W3C model
        } else {
            event.cancelBubble = true; // IE model
        }
    }
} catch(err) {
    console.error('Error loading eventStopPropagation(): ' + err);
}
/* event propagation stop END */

/* set item innter HTML with JS execution */
try {
	function setInnerHTML(elm, html) {		
		/*elm.innerHTML = html;
		Array.from(elm.querySelectorAll("script")).forEach( oldScript => {
			const newScript = document.createElement("script");
			Array.from(oldScript.attributes).forEach( attr => newScript.setAttribute(attr.name, attr.value) );
			newScript.appendChild(document.createTextNode(oldScript.innerHTML));
			oldScript.parentNode.replaceChild(newScript, oldScript);
		});*/
		try {			
			$(elm).html(html);
			//var time = 100;
			$(elm).find("script").each(function(){
				try {
					eval($(this).text());
					//setTimeout( function(){ eval($(this).text()); }, time)
					//time += 100;
				}
				catch (eerr) {
					console.error('Error on setInnerHTML eval(): ' + eerr);
				}
			});
		} catch(ierr) {
			console.error('Error on setInnerHTML(): ' + ierr);
		}
	}
} catch(err) {
    console.error('Error loading setInnerHTML(): ' + err);
}
/* set item innter HTML with JS execution END*/

/*page scroll detection*/
try {
    if (typeof window.scrollpage === 'undefined') {
        function scrollpage () {
            try {
                document.body.classList.add("scroll"); //scrolled
                var scrollTop = window.pageYOffset;
                if( scrollTop > 0 ){ document.body.classList.remove("scroll-top");document.body.classList.add("scroll-mid"); } else { document.body.classList.add("scroll-top");document.body.classList.remove("scroll-mid"); } //scroll al top?
                if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) { document.body.classList.add("scroll-bottom");document.body.classList.remove("scroll-mid"); } else	{ document.body.classList.remove("scroll-bottom"); } //scroll al bottom? 
            } catch (err) {console.log(err);}
        }
        window.onscroll = scrollpage;    
    }
    document.addEventListener("DOMContentLoaded", function(event) { 
        scrollpage();
    });
} catch (err) {
    console.error('Error loading scrollpage(): ' + err);
}
/* page scroll detection END */

/* page parts (header,body,footer) scroll detection*/
try {
  
  var pageObserver = new IntersectionObserver(function(entries) {
    // since there is a single target to be observed, there will be only one entry
    for (var i  = 0; i < entries.length; i++) {
      let entry = entries[i];

      entry.target.classList.add("mb-js-scroll");
      if (!(window.interseccion)) {window.interseccion = [];}
      if (!window.interseccion[entry.target.classList.toString().replace("out","").replace("zero","").trim()]) {
        
        window.interseccion[entry.target.classList.toString().replace("out","").replace("zero","").trim()] = true;

        entry.target.classList.remove("out");
        entry.target.classList.remove("part");
        entry.target.classList.remove("in");
        entry.target.classList.remove("zero");
        
        //var style = entry.target.getComputedStyle ? getComputedStyle(entry.target, null) : entry.target.currentStyle;
        if (entry.target.clientHeight == 0) {// && ((parseInt(style.marginTop) || 0) + (parseInt(style.marginBottom) || 0)) == 0) {
          entry.target.classList.add("zero");
        }

        setTimeout(function() {
          if(entry['isIntersecting'] === true) {
            if(entry['intersectionRatio'] === 1) {
              entry.target.classList.add("in");
            } else if(entry['intersectionRatio'] > 0) {
              //console.log('Less than 50% of target is visible in the screen');
              entry.target.classList.add("part");
            }
          } else {
            //console.log('Target is not visible in the screen');
            entry.target.classList.add("out");
          }
          if ( entry.target.classList.contains("zero") && entry.target.classList.contains("in") && entry.target.classList.contains("out")) {  
            entry.target.classList.remove("in");
          }

          delete window.interseccion[entry.target.classList.toString().replace("out","").replace("zero","").trim()];
          window.interseccion = window.interseccion.filter((obj) => obj);
        }, document.querySelector('body').classList.contains("CMSMode") ? 100 : 0);
      }
      
      //if(entries[i]['isIntersecting'] === true) {
      //  if(entries[i]['intersectionRatio'] === 1) {
      //    entries[i].target.classList.add("in");
      //  } else if(entries[i]['intersectionRatio'] > 0) {
      //    //console.log('Less than 50% of target is visible in the screen');
      //    entries[i].target.classList.add("part");
      //  }
      //}
      //else {
      //  //console.log('Target is not visible in the screen');
      //  entries[i].target.classList.add("out");
      //}
    }
  }, { threshold: [0,1] });
  
  function observeScroll(item) {
    if (item) { pageObserver.observe(item); }
  }
  function unobserveScroll(item) {
    if (item) { pageObserver.unobserve(item); }
  }

  observeScroll(document.querySelector(".mb-panel-hellobar"));
  observeScroll(document.querySelector("header.mb-panel-cabecera-sup"));
  observeScroll(document.querySelector("header.mb-panel-cabecera"));
  observeScroll(document.querySelector("header.mb-panel-cabecera-sub"));
  observeScroll(document.querySelector(".mb-center"));
  observeScroll(document.querySelector("footer.mb-panel-pie-sup"));
  observeScroll(document.querySelector("footer.mb-panel-pie"));
  observeScroll(document.querySelector("footer.mb-panel-pie-sub"));


} catch (err) {
  console.error('Error loading observeScroll(): ' + err);
}
/* page parts (header,body,footer) scroll detection END */

/* item is in view */
try {
  function isInViewport(elem) {
    var distance = elem.getBoundingClientRect();
    return (
      distance.top >= 0 &&
      distance.left >= 0 &&
      distance.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
      distance.right <= (window.innerWidth || document.documentElement.clientWidth)
    );
  };
} catch (err) {
    console.error('Error loading isInViewport(): ' + err);
}
/* item is in view END*/

/* item is out view */
try {
  function IsOutOfViewport(elem) {
    var rect = elem.getBoundingClientRect();
    return (
            (rect.x + rect.width) < 0 
              || (rect.y + rect.height) < 0
              || (rect.x > window.innerWidth || rect.y > window.innerHeight)
          );
  };
} catch (err) {
    console.error('Error loading IsOutOfViewport(): ' + err);
}
/* item is out view END*/

/* carga asincrona de referencia externa javascript */
document.addEventListener("DOMContentLoaded", function(event) { 
  jQuery.loadScript = function (url, callback) {
    jQuery.ajax({
        url: url,
        dataType: 'script',
        success: callback,
        async: true
    });
  }
});
/* carga asincrona de referencia externa javascript END */

/* carga asincrona de referencia externa css */
function getCSS(path) {
  try {
    var link = document.createElement( "link" );
    link.href = path;
    link.type = "text/css";
    link.rel = "stylesheet";
    link.media = "screen,print";

    var head = document.getElementsByTagName( "head" )[0];
    head.insertBefore(link, head.firstChild)

    //document.getElementsByTagName( "head" )[0].appendChild( link )
  } catch (err) {
    console.error('Error getCSS(\'' + path + '\'): ' + err);
  }

}
/* carga asincrona de referencia externa css END */

/* capas desplegables */
try {
  function loadJSdesplegable(jsDesplegableSelector) {
    $(jsDesplegableSelector + ' .mb-js-desplegable').children('.mb-js-desplegable-boton').click(function(e) {
        var principal = $(this).parent('.mb-js-desplegable').data('js-desplegable-principal') == undefined ? false : $(this).parent('.mb-js-desplegable').data('js-desplegable-principal');
        var acordeon = $(this).parent('.mb-js-desplegable').data('js-desplegable-acordeon') == undefined ? true : $(this).parent('.mb-js-desplegable').data('js-desplegable-acordeon');
        var op = !$(this).parent('.mb-js-desplegable').hasClass('abierto');
        if (principal) {
          $('body').toggleClass('mb-js-desplegable-abierto',false);  
          var capasAfectadas = $('.mb-js-desplegable[data-js-desplegable-principal]')
                      .not($(this).parents('.mb-js-desplegable'))
                      .not($(this).parent('.mb-js-desplegable').find('.mb-js-desplegable.abierto'));
          capasAfectadas.toggleClass('abierto',false);
          capasAfectadas.children('.mb-js-desplegable-capa').toggleClass('abierto',false);
          var op = !$(this).parent('.mb-js-desplegable').hasClass('abierto');
          if (acordeon) {$(this).siblings('.mb-js-desplegable-capa').toggleClass('abierto',op);}
          $(this).parent('.mb-js-desplegable').toggleClass('abierto',op);
          $(this).parent('.mb-js-desplegable').children('.mb-js-desplegable-capa').toggleClass('abierto',op);
          if (op) {
              $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-open");
          } else {
              $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-close");
          }
        } else {
          var op = !$(this).parent('.mb-js-desplegable').hasClass('abierto');
          $(this).parent('.mb-js-desplegable').toggleClass('abierto',op);
          $(this).parent('.mb-js-desplegable').find('.mb-js-desplegable-capa').toggleClass('abierto',op);
          if (op) {
              $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-open");
          } else {
              $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-close");
          }
        }
        eventStopPropagation(e);
    });
    $(jsDesplegableSelector + ' .mb-js-desplegable-cerrar,.mb-js-desplegable-capa .overlay').click(function(e) {
        $('body').toggleClass('mb-js-desplegable-abierto',false);
        $(this).parents('.mb-js-desplegable-capa').toggleClass('abierto',false);
        $(this).parents('.mb-js-desplegable-capa').parent('.mb-js-desplegable').toggleClass('abierto',false);
        $(this).parents('.mb-js-desplegable-capa').parent('.mb-js-desplegable').trigger("mb-js-desplegable-close");
        eventStopPropagation(e);
    });
  }
  document.addEventListener("DOMContentLoaded", function(event) { 
        loadJSdesplegable('');
        /*$('.mb-js-desplegable').children('.mb-js-desplegable-boton').click(function(e) {
            var principal = $(this).parent('.mb-js-desplegable').data('js-desplegable-principal') == undefined ? false : $(this).parent('.mb-js-desplegable').data('js-desplegable-principal');
            var acordeon = $(this).parent('.mb-js-desplegable').data('js-desplegable-acordeon') == undefined ? true : $(this).parent('.mb-js-desplegable').data('js-desplegable-acordeon');
            var op = !$(this).parent('.mb-js-desplegable').hasClass('abierto');
            if (principal) {
              $('body').toggleClass('mb-js-desplegable-abierto',false);  
              var capasAfectadas = $('.mb-js-desplegable[data-js-desplegable-principal]')
                          .not($(this).parents('.mb-js-desplegable'))
                          .not($(this).parent('.mb-js-desplegable').find('.mb-js-desplegable.abierto'));
              capasAfectadas.toggleClass('abierto',false);
              capasAfectadas.children('.mb-js-desplegable-capa').toggleClass('abierto',false);
              var op = !$(this).parent('.mb-js-desplegable').hasClass('abierto');
              if (acordeon) {$(this).siblings('.mb-js-desplegable-capa').toggleClass('abierto',op);}
              $(this).parent('.mb-js-desplegable').toggleClass('abierto',op);
              $(this).parent('.mb-js-desplegable').children('.mb-js-desplegable-capa').toggleClass('abierto',op);
              if (op) {
                  $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-open");
              } else {
                  $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-close");
              }
            } else {
              var op = !$(this).parent('.mb-js-desplegable').hasClass('abierto');
              $(this).parent('.mb-js-desplegable').toggleClass('abierto',op);
              $(this).parent('.mb-js-desplegable').find('.mb-js-desplegable-capa').toggleClass('abierto',op);
              if (op) {
                  $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-open");
              } else {
                  $(this).parent('.mb-js-desplegable').trigger("mb-js-desplegable-close");
              }
            }
            eventStopPropagation(e);
        });
        $('.mb-js-desplegable-cerrar,.mb-js-desplegable-capa .overlay').click(function(e) {
            $('body').toggleClass('mb-js-desplegable-abierto',false);
            $(this).parents('.mb-js-desplegable-capa').toggleClass('abierto',false);
            $(this).parents('.mb-js-desplegable-capa').parent('.mb-js-desplegable').toggleClass('abierto',false);
            $(this).parents('.mb-js-desplegable-capa').parent('.mb-js-desplegable').trigger("mb-js-desplegable-close");
            eventStopPropagation(e);
        });*/
  });
} catch (err) {
    console.error('Error loading .mb-js-desplegable script: ' + err);
}
/* capas desplegables END */

/* capas modales */
function openModal(modal) {
  $('.mb-js-modal').toggleClass('open',false);
  $('body').toggleClass('modal-open',false);
  $(modal).toggleClass('open',true);
  $(modal).trigger('modalopen');
  $('body').toggleClass('modal-open',true);
  return false;
}
function closeModal(modal) {
  $(modal).toggleClass('open',false);
  $(modal).trigger('modalclose');
  $('body').toggleClass('modal-open',false);
  return false;
}
function toggleModal(modal) {
  if ($(modal).hasClass('open')) {
    closeModal(modal);
  } else {
    openModal(modal);
  }
}

document.addEventListener("DOMContentLoaded", function(event) { 
  try{
    $('.mb-js-modal').each(function(i) {
      var modal = $(this).clone();
      if ($(this).attr("id") != null && $(this).attr("id") != '') {
        $(modal).addClass($(this).attr("id"));
      }
      $(this).remove();
      $(modal).find('.mb-js-modal-content').click(function(e) {
        eventStopPropagation(e);
      })
      $('body').append(modal);
    });
    $('.mb-js-modal').click(function(e){
      //$(this).toggleClass('open',false);
      //$('body').toggleClass('modal-open',false);
      closeModal(this);
      eventStopPropagation(e);
    });
    $('.mb-js-modal *[data-dismiss="modal"]').click(function(e){
      //$(this).parents('.mb-js-modal').toggleClass('open',false);
      //$('body').toggleClass('modal-open',false);
      $(this).parents('.mb-js-modal').each(function() {
        closeModal(this);
      })
      eventStopPropagation(e);
    });
    $('[data-toggle="modal"]').click(function(e) {
      if ($(this).data('target') !== undefined) {
        //$('.mb-js-modal').toggleClass('open',false);
        //$('.mb-js-modal').trigger('modalclose');
        $('.mb-js-modal.open').modal('close');
        $($(this).data('target') + '.mb-js-modal').toggleClass('open',true);
        $($(this).data('target') + '.mb-js-modal').trigger('modalopen');
        $('body').toggleClass('modal-open',true);
        e.preventDefault();
        return false;
      }
    });
    (function ( $ ) {
        $.fn.modal = function(action) {
          var m_action = action;
            this.filter('.mb-js-modal').each(function() {
              if (!action || action == ''){
                openModal(this);
              } else {
                switch (action.toLowerCase()) {
                  case 'open':
                  case 'show':
                    openModal(this);
                    break;
                  case 'close':
                  case 'hide':
                    closeModal(this);
                    break;
                  case 'toggle':
                    toggleModal(this);
                    break;
                }
              }
            });
            return this;
        };
    }( jQuery ));
    loadJSdesplegable('.mb-js-modal');
  } catch (err) {
      console.error('Error loading .mb-js-modal script: ' + err);
  }
});
/* capas modales END*/

/* menus con dropdown */
document.addEventListener("DOMContentLoaded", function(event) { 
    try {
        $('.menu .item > .dropdown').click(function(e) {
            //preventdefault
            var op = !$(this).hasClass('abierto');
            $(this).closest('.menu').children('.item').toggleClass('abierto',false);
            $(this).closest('.menu').children('.item').toggleClass('abierto',false);
            $(this).closest('.menu').children('.item').children('.dropdown, .menu').toggleClass('abierto',false);
            
            $(this).toggleClass('abierto',op);
            $(this).closest('.item').toggleClass('abierto',op);
            $(this).siblings('.menu').toggleClass('abierto',op);
            if (op) {
                $(this).siblings('.menu').trigger("mb-js-menu-open");
            } else {
                $(this).siblings('.menu').trigger("mb-js-menu-close");
            }
            return false;
        });
    } catch (err) {
        console.error('Error loading .mb-js-desplegable script: ' + err);
    }
});
/* menus con dropdown */

/* tabs / pestañas */
try {
  function openTab(tabCollection,tabName) {
    // Declare all variables
    var i, tabcontent, tablinks;

    // Get all elements with class="tab-content" and hide them
    $(tabCollection).find('.tab-content').removeClass('active');//.hide();

    // Get all elements with class="tablinks" and remove the class "active"
    $(tabCollection).find('.tab-link').removeClass('active');

    // Show the current tab, and add an "active" class to the button that opened the tab
    $(tabCollection).find(".tab-content[data-tab='" + tabName + "']").addClass('active');//.show();
    $(tabCollection).find(".tab-link[data-tab='" + tabName + "']").addClass('active');
    $(tabCollection).attr("data-currenttab",tabName);
  }
} catch(err) {
  console.error('Error loading openTab(): ' + err);
}

document.addEventListener("DOMContentLoaded", function(event) { 
  try {
    $('.mb-js-tabs .tab-link').click(function(e) {
        openTab($(this).parents('.mb-js-tabs'),$(this).data("tab"));
        return false;
    });
  } catch (err) {
      console.error('Error loading .mb-js-tabs script: ' + err);
  }
});
/* tabs / pestañas END */

/* links con anchor */
document.addEventListener("DOMContentLoaded", function(event) { 
  try {
    setTimeout(function () {
      if (window.location.hash) {
        try {
          var _lnks = $("a[id=" + window.location.hash.replace("#","")  + "],a[name=" + window.location.hash.replace("#","")  + "]");
          var _topOffset = 0;
          if (_lnks.length>0) { _topOffset = _lnks.first().offset().top; }
          $('html, body').animate({
            scrollTop: _topOffset - ($('.mb-panel-hellobar').outerHeight() || 0) - ($('.mb-panel-cabecera').outerHeight() || 0) - ($('.mb-panel-cabecera-sup').outerHeight() || 0) - ($('#CMSUpperBar').outerHeight() || 0)
          }, 0);
        } catch (err) {
          console.error(err);
        }
      }
    }, 100);
  } catch (err) {
      console.error('Error loading window.location.hash animate script: ' + err);
  }
});
/* links con anchor END */

/* mb-mensaje con cierre */
document.addEventListener("DOMContentLoaded", function(event) { 
  try {
    $('.mb-js-mensaje .close').click(function(e) {
        $(this).parents('.mb-js-mensaje').remove();
    });
  } catch (err) {
      console.error('Error loading .mb-js-mensaje script: ' + err);
  }
});
/* mb-mensaje con cierre END */

throttle = function(func, wait, options) {
  var timeout, context, args, result;
  var previous = 0;
  if (!options) options = {};

  var later = function() {
    previous = options.leading === false ? 0 : _.now();
    timeout = null;
    result = func.apply(context, args);
    if (!timeout) context = args = null;
  };

  var throttled = function() {
    var now = _.now();
    if (!previous && options.leading === false) previous = now;
    var remaining = wait - (now - previous);
    context = this;
    args = arguments;
    if (remaining <= 0 || remaining > wait) {
      if (timeout) {
        clearTimeout(timeout);
        timeout = null;
      }
      previous = now;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining);
    }
    return result;
  };

  throttled.cancel = function() {
    clearTimeout(timeout);
    previous = 0;
    timeout = context = args = null;
  };

  return throttled;
};

/* plugin carga imagenes lazy */
var lazyLoadInstance;
document.addEventListener("DOMContentLoaded", function(event) { 
  try {
    if ($('.lazy').length > 0) {
      $.getScript('/js/lazyload/dist/lazyload.min.js', function()
      {
        lazyLoadInstance = new LazyLoad({
          elements_selector: ".lazy",
          class_loading: "lazy-loading",
          class_loaded: "lazy-loaded",
          class_error: "lazy-error"
          // ... more custom settings?
        });
        if (lazyLoadInstance) {
          lazyLoadInstance.update();
          window.addEventListener('scroll', function(){ if (lazyLoadInstance) { lazyLoadInstance.update() } });
          window.addEventListener('resize', function(){ if (lazyLoadInstance) { lazyLoadInstance.update() } });
        }
      });
    }
  } catch (err) {
      console.error('Error loading lazyload plugin: ' + err);
  }
});
/* plugin carga imagenes lazy END*/

/* plugin jquery sliders 'Slick' */
document.addEventListener("DOMContentLoaded", function(event) { 
  try {
    
    if ($('.mb-js-slider').length > 0) {
      $.getScript('/js/slick/slick.min.js', function()
      {
          // script is now loaded and executed.
          // put your dependent JS here.
          //$('.mb-js-slider').slick();
          $.getScript('/js/slick/extraSlickOptions.js', function()
          {
              // script is now loaded and executed.
              // put your dependent JS here.
              $('.mb-js-slider').slick();
          });
      });
    }
  } catch (err) {
      console.error('Error loading .mb-js-slider script: ' + err);
  }
});
/* plugin jquery sliders 'Slick' END */

/* plugin lightbox */
document.addEventListener("DOMContentLoaded", function(event) {
  try {
    if ($('[data-lightbox]').length > 0) {
      $.getScript('/js/lightbox2/js/lightbox.min.js',function(script, textStatus) {
        lightbox.option({
          'resizeDuration': 200,
          'wrapAround': true,
          'albumLabel': "%1 / %2"
        });
      });
      getCSS('/js/lightbox2/css/lightbox.min.css');
    }
  } catch (err) {
      console.error('Error loading lightbox script: ' + err);
  }
});
/* plugin lightbox END*/

/* plugin jquery botones con estados */
document.addEventListener("DOMContentLoaded", function(event) { 
  try {
    
  +function ($) {
    'use strict';

    // BUTTON PUBLIC CLASS DEFINITION
    // ==============================

    var Button = function (element, options) {
      this.$element  = $(element)
      this.options   = $.extend({}, Button.DEFAULTS, options)
      this.isLoading = false
    }

    Button.VERSION  = '3.4.1'

    Button.DEFAULTS = {
      loadingText: 'loading...'
    }

    Button.prototype.setState = function (state) {
      var d    = 'disabled'
      var $el  = this.$element
      var val  = $el.is('input') ? 'val' : 'html'
      var data = $el.data()

      state += 'Text'

      if (data.resetText == null) $el.data('resetText', $el[val]())

      // push to event loop to allow forms to submit
      setTimeout($.proxy(function () {
        $el[val](data[state] == null ? this.options[state] : data[state])

        if (state == 'loadingText') {
          this.isLoading = true
          $el.addClass(d).attr(d, d).prop(d, true)
        } else if (this.isLoading) {
          this.isLoading = false
          $el.removeClass(d).removeAttr(d).prop(d, false)
        }
      }, this), 0)
    }

    Button.prototype.toggle = function () {
      var changed = true
      var $parent = this.$element.closest('[data-toggle="buttons"]')

      if ($parent.length) {
        var $input = this.$element.find('input')
        if ($input.prop('type') == 'radio') {
          if ($input.prop('checked')) changed = false
          $parent.find('.active').removeClass('active')
          this.$element.addClass('active')
        } else if ($input.prop('type') == 'checkbox') {
          if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
          this.$element.toggleClass('active')
        }
        $input.prop('checked', this.$element.hasClass('active'))
        if (changed) $input.trigger('change')
      } else {
        this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
        this.$element.toggleClass('active')
      }
    }


    // BUTTON PLUGIN DEFINITION
    // ========================

    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.button')
        var options = typeof option == 'object' && option

        if (!data) $this.data('bs.button', (data = new Button(this, options)))

        if (option == 'toggle') data.toggle()
        else if (option) data.setState(option)
      })
    }

    var old = $.fn.button

    $.fn.button             = Plugin
    $.fn.button.Constructor = Button


    // BUTTON NO CONFLICT
    // ==================

    $.fn.button.noConflict = function () {
      $.fn.button = old
      return this
    }


    // BUTTON DATA-API
    // ===============

    $(document)
      .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        var $btn = $(e.target).closest('.btn')
        Plugin.call($btn, 'toggle')
        if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
          // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
          e.preventDefault()
          // The target component still receive the focus
          if ($btn.is('input,button')) $btn.trigger('focus')
          else $btn.find('input:visible,button:visible').first().trigger('focus')
        }
      })
      .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
        $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
      })

  }(jQuery);

  } catch (err) {
      console.error('Error loading .mb-js-slider script: ' + err);
  }
});
/* plugin jquery botones con estados END */

/* ajuste jQuery listeners passive para mejorar pageSpeed de Google */

document.addEventListener("DOMContentLoaded", function(event) { 
	try {
		jQuery.event.special.touchstart = {
			setup: function( _, ns, handle ) {
				this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
			}
		};
		jQuery.event.special.touchmove = {
			setup: function( _, ns, handle ) {
				this.addEventListener("touchmove", handle, { passive: !ns.includes("noPreventDefault") });
			}
		};
		jQuery.event.special.wheel = {
			setup: function( _, ns, handle ){
				this.addEventListener("wheel", handle, { passive: true });
			}
		};
		jQuery.event.special.mousewheel = {
			setup: function( _, ns, handle ){
				this.addEventListener("mousewheel", handle, { passive: true });
			}
		};
	} catch (err) {
		console.error('Error loading jQuery passive listeners script: ' + err);
	}
});
/* ajuste jQuery eventos passive para mejorar pageSpeed de Google END */

/*
 * LLamada externa a la función AddToCart, para agregar productos al carrito desde servicios
 * externos.
 */
var addToCart = function(ID_product, ID_sku, ID_pricelist, quantity) {
  let urlAjax = "/process/process.aspx?action=send_NewShoppingCartService";
  
  $.post(urlAjax, { 
      IDProduct: ID_product, 
      skuIDFinal: ID_sku, 
      quantityFinal: quantity, 
      IDPriceList: ID_pricelist, 
  },
  function (data) {
      var obj = jQuery.parseJSON(data);
      if (obj.status == "OK") {
          if (obj.scripts != null && obj.scripts != ""){
            try {
              eval(obj.scripts);
            } catch (error) {
              console.error('There was an error executing scripts of "eval"' + error)
            }
            try {
              let idDivCarrito = "#" + $(".mb-mod-cartsummary")[0].id;
              let nodoScript = $(".mb-mod-cartsummary script")[0];
              //Recargar solo el contenido de una sección especifica.
              $(idDivCarrito).load("/ " + idDivCarrito + " > *", function() {
                  //Agregamos el nodo script al final de otro.
                  $(idDivCarrito).append(nodoScript);
                  $(idDivCarrito).attr("onclick", "$('.mb-mod-cartsummary div.mb-js-desplegable-capa').toggle();")
              }); 
            } catch (error) {
              console.error("Loading partially gave error on cart summary" + error);  
            }
            try {
              alert(obj.message);
            } catch (error) {} 
          }
      } else {
          alert(obj.message);
          console.info(obj.message);
      }
  }).fail(function (xhr,status,error) {
      if(xhr.readyState == 0 || xhr.status == 0) {
          return;  // it's not really an error
      } else {
          alert('Error: ' + xhr.statusText + ' (' + xhr.status + ')');
          console.log('Error: ' + xhr.statusText + ' (' + xhr.status + ')');
          return;
      }
  });
}