Template:Hangzhou-H14Z/js/owlcarousel

/*

*  jQuery OwlCarousel v1.3.2
*
*  Copyright (c) 2013 Bartosz Wojciechowski
*  http://www.owlgraphic.com/owlcarousel/
*
*  Licensed under MIT
*
*/

/*JS Lint helpers: */ /*global dragMove: false, dragEnd: false, $, jQuery, alert, window, document */ /*jslint nomen: true, continue:true */

if (typeof Object.create !== "function") {

   Object.create = function (obj) {
       function F() {}
       F.prototype = obj;
       return new F();
   };

} (function ($, window, document) {

   var Carousel = {
       init : function (options, el) {
           var base = this;
           base.$elem = $(el);
           base.options = $.extend({}, $.fn.owlCarousel.options, base.$elem.data(), options);
           base.userOptions = options;
           base.loadContent();
       },
       loadContent : function () {
           var base = this, url;
           function getData(data) {
               var i, content = "";
               if (typeof base.options.jsonSuccess === "function") {
                   base.options.jsonSuccess.apply(this, [data]);
               } else {
                   for (i in data.owl) {
                       if (data.owl.hasOwnProperty(i)) {
                           content += data.owl[i].item;
                       }
                   }
                   base.$elem.html(content);
               }
               base.logIn();
           }
           if (typeof base.options.beforeInit === "function") {
               base.options.beforeInit.apply(this, [base.$elem]);
           }
           if (typeof base.options.jsonPath === "string") {
               url = base.options.jsonPath;
               $.getJSON(url, getData);
           } else {
               base.logIn();
           }
       },
       logIn : function () {
           var base = this;
           base.$elem.data("owl-originalStyles", base.$elem.attr("style"))
                     .data("owl-originalClasses", base.$elem.attr("class"));
           base.$elem.css({opacity: 0});
           base.orignalItems = base.options.items;
           base.checkBrowser();
           base.wrapperWidth = 0;
           base.checkVisible = null;
           base.setVars();
       },
       setVars : function () {
           var base = this;
           if (base.$elem.children().length === 0) {return false; }
           base.baseClass();
           base.eventTypes();
           base.$userItems = base.$elem.children();
           base.itemsAmount = base.$userItems.length;
           base.wrapItems();
           base.$owlItems = base.$elem.find(".owl-item");
           base.$owlWrapper = base.$elem.find(".owl-wrapper");
           base.playDirection = "next";
           base.prevItem = 0;
           base.prevArr = [0];
           base.currentItem = 0;
           base.customEvents();
           base.onStartup();
       },
       onStartup : function () {
           var base = this;
           base.updateItems();
           base.calculateAll();
           base.buildControls();
           base.updateControls();
           base.response();
           base.moveEvents();
           base.stopOnHover();
           base.owlStatus();
           if (base.options.transitionStyle !== false) {
               base.transitionTypes(base.options.transitionStyle);
           }
           if (base.options.autoPlay === true) {
               base.options.autoPlay = 5000;
           }
           base.play();
           base.$elem.find(".owl-wrapper").css("display", "block");
           if (!base.$elem.is(":visible")) {
               base.watchVisibility();
           } else {
               base.$elem.css("opacity", 1);
           }
           base.onstartup = false;
           base.eachMoveUpdate();
           if (typeof base.options.afterInit === "function") {
               base.options.afterInit.apply(this, [base.$elem]);
           }
       },
       eachMoveUpdate : function () {
           var base = this;
           if (base.options.lazyLoad === true) {
               base.lazyLoad();
           }
           if (base.options.autoHeight === true) {
               base.autoHeight();
           }
           base.onVisibleItems();
           if (typeof base.options.afterAction === "function") {
               base.options.afterAction.apply(this, [base.$elem]);
           }
       },
       updateVars : function () {
           var base = this;
           if (typeof base.options.beforeUpdate === "function") {
               base.options.beforeUpdate.apply(this, [base.$elem]);
           }
           base.watchVisibility();
           base.updateItems();
           base.calculateAll();
           base.updatePosition();
           base.updateControls();
           base.eachMoveUpdate();
           if (typeof base.options.afterUpdate === "function") {
               base.options.afterUpdate.apply(this, [base.$elem]);
           }
       },
       reload : function () {
           var base = this;
           window.setTimeout(function () {
               base.updateVars();
           }, 0);
       },
       watchVisibility : function () {
           var base = this;
           if (base.$elem.is(":visible") === false) {
               base.$elem.css({opacity: 0});
               window.clearInterval(base.autoPlayInterval);
               window.clearInterval(base.checkVisible);
           } else {
               return false;
           }
           base.checkVisible = window.setInterval(function () {
               if (base.$elem.is(":visible")) {
                   base.reload();
                   base.$elem.animate({opacity: 1}, 200);
                   window.clearInterval(base.checkVisible);
               }
           }, 500);
       },
       wrapItems : function () {
           var base = this;
base.$userItems.wrapAll("
").wrap("
"); base.$elem.find(".owl-wrapper").wrap("
");
           base.wrapperOuter = base.$elem.find(".owl-wrapper-outer");
           base.$elem.css("display", "block");
       },
       baseClass : function () {
           var base = this,
               hasBaseClass = base.$elem.hasClass(base.options.baseClass),
               hasThemeClass = base.$elem.hasClass(base.options.theme);
           if (!hasBaseClass) {
               base.$elem.addClass(base.options.baseClass);
           }
           if (!hasThemeClass) {
               base.$elem.addClass(base.options.theme);
           }
       },
       updateItems : function () {
           var base = this, width, i;
           if (base.options.responsive === false) {
               return false;
           }
           if (base.options.singleItem === true) {
               base.options.items = base.orignalItems = 1;
               base.options.itemsCustom = false;
               base.options.itemsDesktop = false;
               base.options.itemsDesktopSmall = false;
               base.options.itemsTablet = false;
               base.options.itemsTabletSmall = false;
               base.options.itemsMobile = false;
               return false;
           }
           width = $(base.options.responsiveBaseWidth).width();
           if (width > (base.options.itemsDesktop[0] || base.orignalItems)) {
               base.options.items = base.orignalItems;
           }
           if (base.options.itemsCustom !== false) {
               //Reorder array by screen size
               base.options.itemsCustom.sort(function (a, b) {return a[0] - b[0]; });
               for (i = 0; i < base.options.itemsCustom.length; i += 1) {
                   if (base.options.itemsCustom[i][0] <= width) {
                       base.options.items = base.options.itemsCustom[i][1];
                   }
               }
           } else {
               if (width <= base.options.itemsDesktop[0] && base.options.itemsDesktop !== false) {
                   base.options.items = base.options.itemsDesktop[1];
               }
               if (width <= base.options.itemsDesktopSmall[0] && base.options.itemsDesktopSmall !== false) {
                   base.options.items = base.options.itemsDesktopSmall[1];
               }
               if (width <= base.options.itemsTablet[0] && base.options.itemsTablet !== false) {
                   base.options.items = base.options.itemsTablet[1];
               }
               if (width <= base.options.itemsTabletSmall[0] && base.options.itemsTabletSmall !== false) {
                   base.options.items = base.options.itemsTabletSmall[1];
               }
               if (width <= base.options.itemsMobile[0] && base.options.itemsMobile !== false) {
                   base.options.items = base.options.itemsMobile[1];
               }
           }
           //if number of items is less than declared
           if (base.options.items > base.itemsAmount && base.options.itemsScaleUp === true) {
               base.options.items = base.itemsAmount;
           }
       },
       response : function () {
           var base = this,
               smallDelay,
               lastWindowWidth;
           if (base.options.responsive !== true) {
               return false;
           }
           lastWindowWidth = $(window).width();
           base.resizer = function () {
               if ($(window).width() !== lastWindowWidth) {
                   if (base.options.autoPlay !== false) {
                       window.clearInterval(base.autoPlayInterval);
                   }
                   window.clearTimeout(smallDelay);
                   smallDelay = window.setTimeout(function () {
                       lastWindowWidth = $(window).width();
                       base.updateVars();
                   }, base.options.responsiveRefreshRate);
               }
           };
           $(window).resize(base.resizer);
       },
       updatePosition : function () {
           var base = this;
           base.jumpTo(base.currentItem);
           if (base.options.autoPlay !== false) {
               base.checkAp();
           }
       },
       appendItemsSizes : function () {
           var base = this,
               roundPages = 0,
               lastItem = base.itemsAmount - base.options.items;
           base.$owlItems.each(function (index) {
               var $this = $(this);
               $this
                   .css({"width": base.itemWidth})
                   .data("owl-item", Number(index));
               if (index % base.options.items === 0 || index === lastItem) {
                   if (!(index > lastItem)) {
                       roundPages += 1;
                   }
               }
               $this.data("owl-roundPages", roundPages);
           });
       },
       appendWrapperSizes : function () {
           var base = this,
               width = base.$owlItems.length * base.itemWidth;
           base.$owlWrapper.css({
               "width": width * 2,
               "left": 0
           });
           base.appendItemsSizes();
       },
       calculateAll : function () {
           var base = this;
           base.calculateWidth();
           base.appendWrapperSizes();
           base.loops();
           base.max();
       },
       calculateWidth : function () {
           var base = this;
           base.itemWidth = Math.round(base.$elem.width() / base.options.items);
       },
       max : function () {
           var base = this,
               maximum = ((base.itemsAmount * base.itemWidth) - base.options.items * base.itemWidth) * -1;
           if (base.options.items > base.itemsAmount) {
               base.maximumItem = 0;
               maximum = 0;
               base.maximumPixels = 0;
           } else {
               base.maximumItem = base.itemsAmount - base.options.items;
               base.maximumPixels = maximum;
           }
           return maximum;
       },
       min : function () {
           return 0;
       },
       loops : function () {
           var base = this,
               prev = 0,
               elWidth = 0,
               i,
               item,
               roundPageNum;
           base.positionsInArray = [0];
           base.pagesInArray = [];
           for (i = 0; i < base.itemsAmount; i += 1) {
               elWidth += base.itemWidth;
               base.positionsInArray.push(-elWidth);
               if (base.options.scrollPerPage === true) {
                   item = $(base.$owlItems[i]);
                   roundPageNum = item.data("owl-roundPages");
                   if (roundPageNum !== prev) {
                       base.pagesInArray[prev] = base.positionsInArray[i];
                       prev = roundPageNum;
                   }
               }
           }
       },
       buildControls : function () {
           var base = this;
           if (base.options.navigation === true || base.options.pagination === true) {
               base.owlControls = $("<div class=\"owl-controls\"/>").toggleClass("clickable", !base.browser.isTouch).appendTo(base.$elem);
           }
           if (base.options.pagination === true) {
               base.buildPagination();
           }
           if (base.options.navigation === true) {
               base.buildButtons();
           }
       },
       buildButtons : function () {
           var base = this,
               buttonsWrapper = $("<div class=\"owl-buttons\"/>");
           base.owlControls.append(buttonsWrapper);
           base.buttonPrev = $("<div/>", {
               "class" : "owl-prev",
               "html" : base.options.navigationText[0] || ""
           });
           base.buttonNext = $("<div/>", {
               "class" : "owl-next",
               "html" : base.options.navigationText[1] || ""
           });
           buttonsWrapper
               .append(base.buttonPrev)
               .append(base.buttonNext);
           buttonsWrapper.on("touchstart.owlControls mousedown.owlControls", "div[class^=\"owl\"]", function (event) {
               event.preventDefault();
           });
           buttonsWrapper.on("touchend.owlControls mouseup.owlControls", "div[class^=\"owl\"]", function (event) {
               event.preventDefault();
               if ($(this).hasClass("owl-next")) {
                   base.next();
               } else {
                   base.prev();
               }
           });
       },
       buildPagination : function () {
           var base = this;
           base.paginationWrapper = $("<div class=\"owl-pagination\"/>");
           base.owlControls.append(base.paginationWrapper);
           base.paginationWrapper.on("touchend.owlControls mouseup.owlControls", ".owl-page", function (event) {
               event.preventDefault();
               if (Number($(this).data("owl-page")) !== base.currentItem) {
                   base.goTo(Number($(this).data("owl-page")), true);
               }
           });
       },
       updatePagination : function () {
           var base = this,
               counter,
               lastPage,
               lastItem,
               i,
               paginationButton,
               paginationButtonInner;
           if (base.options.pagination === false) {
               return false;
           }
           base.paginationWrapper.html("");
           counter = 0;
           lastPage = base.itemsAmount - base.itemsAmount % base.options.items;
           for (i = 0; i < base.itemsAmount; i += 1) {
               if (i % base.options.items === 0) {
                   counter += 1;
                   if (lastPage === i) {
                       lastItem = base.itemsAmount - base.options.items;
                   }
                   paginationButton = $("<div/>", {
                       "class" : "owl-page"
                   });
                   paginationButtonInner = $("", {
                       "text": base.options.paginationNumbers === true ? counter : "",
                       "class": base.options.paginationNumbers === true ? "owl-numbers" : ""
                   });
                   paginationButton.append(paginationButtonInner);
                   paginationButton.data("owl-page", lastPage === i ? lastItem : i);
                   paginationButton.data("owl-roundPages", counter);
                   base.paginationWrapper.append(paginationButton);
               }
           }
           base.checkPagination();
       },
       checkPagination : function () {
           var base = this;
           if (base.options.pagination === false) {
               return false;
           }
           base.paginationWrapper.find(".owl-page").each(function () {
               if ($(this).data("owl-roundPages") === $(base.$owlItems[base.currentItem]).data("owl-roundPages")) {
                   base.paginationWrapper
                       .find(".owl-page")
                       .removeClass("active");
                   $(this).addClass("active");
               }
           });
       },
       checkNavigation : function () {
           var base = this;
           if (base.options.navigation === false) {
               return false;
           }
           if (base.options.rewindNav === false) {
               if (base.currentItem === 0 && base.maximumItem === 0) {
                   base.buttonPrev.addClass("disabled");
                   base.buttonNext.addClass("disabled");
               } else if (base.currentItem === 0 && base.maximumItem !== 0) {
                   base.buttonPrev.addClass("disabled");
                   base.buttonNext.removeClass("disabled");
               } else if (base.currentItem === base.maximumItem) {
                   base.buttonPrev.removeClass("disabled");
                   base.buttonNext.addClass("disabled");
               } else if (base.currentItem !== 0 && base.currentItem !== base.maximumItem) {
                   base.buttonPrev.removeClass("disabled");
                   base.buttonNext.removeClass("disabled");
               }
           }
       },
       updateControls : function () {
           var base = this;
           base.updatePagination();
           base.checkNavigation();
           if (base.owlControls) {
               if (base.options.items >= base.itemsAmount) {
                   base.owlControls.hide();
               } else {
                   base.owlControls.show();
               }
           }
       },
       destroyControls : function () {
           var base = this;
           if (base.owlControls) {
               base.owlControls.remove();
           }
       },
       next : function (speed) {
           var base = this;
           if (base.isTransition) {
               return false;
           }
           base.currentItem += base.options.scrollPerPage === true ? base.options.items : 1;
           if (base.currentItem > base.maximumItem + (base.options.scrollPerPage === true ? (base.options.items - 1) : 0)) {
               if (base.options.rewindNav === true) {
                   base.currentItem = 0;
                   speed = "rewind";
               } else {
                   base.currentItem = base.maximumItem;
                   return false;
               }
           }
           base.goTo(base.currentItem, speed);
       },
       prev : function (speed) {
           var base = this;
           if (base.isTransition) {
               return false;
           }
           if (base.options.scrollPerPage === true && base.currentItem > 0 && base.currentItem < base.options.items) {
               base.currentItem = 0;
           } else {
               base.currentItem -= base.options.scrollPerPage === true ? base.options.items : 1;
           }
           if (base.currentItem < 0) {
               if (base.options.rewindNav === true) {
                   base.currentItem = base.maximumItem;
                   speed = "rewind";
               } else {
                   base.currentItem = 0;
                   return false;
               }
           }
           base.goTo(base.currentItem, speed);
       },
       goTo : function (position, speed, drag) {
           var base = this,
               goToPixel;
           if (base.isTransition) {
               return false;
           }
           if (typeof base.options.beforeMove === "function") {
               base.options.beforeMove.apply(this, [base.$elem]);
           }
           if (position >= base.maximumItem) {
               position = base.maximumItem;
           } else if (position <= 0) {
               position = 0;
           }
           base.currentItem = base.owl.currentItem = position;
           if (base.options.transitionStyle !== false && drag !== "drag" && base.options.items === 1 && base.browser.support3d === true) {
               base.swapSpeed(0);
               if (base.browser.support3d === true) {
                   base.transition3d(base.positionsInArray[position]);
               } else {
                   base.css2slide(base.positionsInArray[position], 1);
               }
               base.afterGo();
               base.singleItemTransition();
               return false;
           }
           goToPixel = base.positionsInArray[position];
           if (base.browser.support3d === true) {
               base.isCss3Finish = false;
               if (speed === true) {
                   base.swapSpeed("paginationSpeed");
                   window.setTimeout(function () {
                       base.isCss3Finish = true;
                   }, base.options.paginationSpeed);
               } else if (speed === "rewind") {
                   base.swapSpeed(base.options.rewindSpeed);
                   window.setTimeout(function () {
                       base.isCss3Finish = true;
                   }, base.options.rewindSpeed);
               } else {
                   base.swapSpeed("slideSpeed");
                   window.setTimeout(function () {
                       base.isCss3Finish = true;
                   }, base.options.slideSpeed);
               }
               base.transition3d(goToPixel);
           } else {
               if (speed === true) {
                   base.css2slide(goToPixel, base.options.paginationSpeed);
               } else if (speed === "rewind") {
                   base.css2slide(goToPixel, base.options.rewindSpeed);
               } else {
                   base.css2slide(goToPixel, base.options.slideSpeed);
               }
           }
           base.afterGo();
       },
       jumpTo : function (position) {
           var base = this;
           if (typeof base.options.beforeMove === "function") {
               base.options.beforeMove.apply(this, [base.$elem]);
           }
           if (position >= base.maximumItem || position === -1) {
               position = base.maximumItem;
           } else if (position <= 0) {
               position = 0;
           }
           base.swapSpeed(0);
           if (base.browser.support3d === true) {
               base.transition3d(base.positionsInArray[position]);
           } else {
               base.css2slide(base.positionsInArray[position], 1);
           }
           base.currentItem = base.owl.currentItem = position;
           base.afterGo();
       },
       afterGo : function () {
           var base = this;
           base.prevArr.push(base.currentItem);
           base.prevItem = base.owl.prevItem = base.prevArr[base.prevArr.length - 2];
           base.prevArr.shift(0);
           if (base.prevItem !== base.currentItem) {
               base.checkPagination();
               base.checkNavigation();
               base.eachMoveUpdate();
               if (base.options.autoPlay !== false) {
                   base.checkAp();
               }
           }
           if (typeof base.options.afterMove === "function" && base.prevItem !== base.currentItem) {
               base.options.afterMove.apply(this, [base.$elem]);
           }
       },
       stop : function () {
           var base = this;
           base.apStatus = "stop";
           window.clearInterval(base.autoPlayInterval);
       },
       checkAp : function () {
           var base = this;
           if (base.apStatus !== "stop") {
               base.play();
           }
       },
       play : function () {
           var base = this;
           base.apStatus = "play";
           if (base.options.autoPlay === false) {
               return false;
           }
           window.clearInterval(base.autoPlayInterval);
           base.autoPlayInterval = window.setInterval(function () {
               base.next(true);
           }, base.options.autoPlay);
       },
       swapSpeed : function (action) {
           var base = this;
           if (action === "slideSpeed") {
               base.$owlWrapper.css(base.addCssSpeed(base.options.slideSpeed));
           } else if (action === "paginationSpeed") {
               base.$owlWrapper.css(base.addCssSpeed(base.options.paginationSpeed));
           } else if (typeof action !== "string") {
               base.$owlWrapper.css(base.addCssSpeed(action));
           }
       },
       addCssSpeed : function (speed) {
           return {
               "-webkit-transition": "all " + speed + "ms ease",
               "-moz-transition": "all " + speed + "ms ease",
               "-o-transition": "all " + speed + "ms ease",
               "transition": "all " + speed + "ms ease"
           };
       },
       removeTransition : function () {
           return {
               "-webkit-transition": "",
               "-moz-transition": "",
               "-o-transition": "",
               "transition": ""
           };
       },
       doTranslate : function (pixels) {
           return {
               "-webkit-transform": "translate3d(" + pixels + "px, 0px, 0px)",
               "-moz-transform": "translate3d(" + pixels + "px, 0px, 0px)",
               "-o-transform": "translate3d(" + pixels + "px, 0px, 0px)",
               "-ms-transform": "translate3d(" + pixels + "px, 0px, 0px)",
               "transform": "translate3d(" + pixels + "px, 0px,0px)"
           };
       },
       transition3d : function (value) {
           var base = this;
           base.$owlWrapper.css(base.doTranslate(value));
       },
       css2move : function (value) {
           var base = this;
           base.$owlWrapper.css({"left" : value});
       },
       css2slide : function (value, speed) {
           var base = this;
           base.isCssFinish = false;
           base.$owlWrapper.stop(true, true).animate({
               "left" : value
           }, {
               duration : speed || base.options.slideSpeed,
               complete : function () {
                   base.isCssFinish = true;
               }
           });
       },
       checkBrowser : function () {
           var base = this,
               translate3D = "translate3d(0px, 0px, 0px)",
               tempElem = document.createElement("div"),
               regex,
               asSupport,
               support3d,
               isTouch;
           tempElem.style.cssText = "  -moz-transform:" + translate3D +
                                 "; -ms-transform:"     + translate3D +
                                 "; -o-transform:"      + translate3D +
                                 "; -webkit-transform:" + translate3D +
                                 "; transform:"         + translate3D;
           regex = /translate3d\(0px, 0px, 0px\)/g;
           asSupport = tempElem.style.cssText.match(regex);
           support3d = (asSupport !== null && asSupport.length === 1);
           isTouch = "ontouchstart" in window || window.navigator.msMaxTouchPoints;
           base.browser = {
               "support3d" : support3d,
               "isTouch" : isTouch
           };
       },
       moveEvents : function () {
           var base = this;
           if (base.options.mouseDrag !== false || base.options.touchDrag !== false) {
               base.gestures();
               base.disabledEvents();
           }
       },
       eventTypes : function () {
           var base = this,
               types = ["s", "e", "x"];
           base.ev_types = {};
           if (base.options.mouseDrag === true && base.options.touchDrag === true) {
               types = [
                   "touchstart.owl mousedown.owl",
                   "touchmove.owl mousemove.owl",
                   "touchend.owl touchcancel.owl mouseup.owl"
               ];
           } else if (base.options.mouseDrag === false && base.options.touchDrag === true) {
               types = [
                   "touchstart.owl",
                   "touchmove.owl",
                   "touchend.owl touchcancel.owl"
               ];
           } else if (base.options.mouseDrag === true && base.options.touchDrag === false) {
               types = [
                   "mousedown.owl",
                   "mousemove.owl",
                   "mouseup.owl"
               ];
           }
           base.ev_types.start = types[0];
           base.ev_types.move = types[1];
           base.ev_types.end = types[2];
       },
       disabledEvents :  function () {
           var base = this;
           base.$elem.on("dragstart.owl", function (event) { event.preventDefault(); });
           base.$elem.on("mousedown.disableTextSelect", function (e) {
               return $(e.target).is('input, textarea, select, option');
           });
       },
       gestures : function () {
           /*jslint unparam: true*/
           var base = this,
               locals = {
                   offsetX : 0,
                   offsetY : 0,
                   baseElWidth : 0,
                   relativePos : 0,
                   position: null,
                   minSwipe : null,
                   maxSwipe: null,
                   sliding : null,
                   dargging: null,
                   targetElement : null
               };
           base.isCssFinish = true;
           function getTouches(event) {
               if (event.touches !== undefined) {
                   return {
                       x : event.touches[0].pageX,
                       y : event.touches[0].pageY
                   };
               }
               if (event.touches === undefined) {
                   if (event.pageX !== undefined) {
                       return {
                           x : event.pageX,
                           y : event.pageY
                       };
                   }
                   if (event.pageX === undefined) {
                       return {
                           x : event.clientX,
                           y : event.clientY
                       };
                   }
               }
           }
           function swapEvents(type) {
               if (type === "on") {
                   $(document).on(base.ev_types.move, dragMove);
                   $(document).on(base.ev_types.end, dragEnd);
               } else if (type === "off") {
                   $(document).off(base.ev_types.move);
                   $(document).off(base.ev_types.end);
               }
           }
           function dragStart(event) {
               var ev = event.originalEvent || event || window.event,
                   position;
               if (ev.which === 3) {
                   return false;
               }
               if (base.itemsAmount <= base.options.items) {
                   return;
               }
               if (base.isCssFinish === false && !base.options.dragBeforeAnimFinish) {
                   return false;
               }
               if (base.isCss3Finish === false && !base.options.dragBeforeAnimFinish) {
                   return false;
               }
               if (base.options.autoPlay !== false) {
                   window.clearInterval(base.autoPlayInterval);
               }
               if (base.browser.isTouch !== true && !base.$owlWrapper.hasClass("grabbing")) {
                   base.$owlWrapper.addClass("grabbing");
               }
               base.newPosX = 0;
               base.newRelativeX = 0;
               $(this).css(base.removeTransition());
               position = $(this).position();
               locals.relativePos = position.left;
               locals.offsetX = getTouches(ev).x - position.left;
               locals.offsetY = getTouches(ev).y - position.top;
               swapEvents("on");
               locals.sliding = false;
               locals.targetElement = ev.target || ev.srcElement;
           }
           function dragMove(event) {
               var ev = event.originalEvent || event || window.event,
                   minSwipe,
                   maxSwipe;
               base.newPosX = getTouches(ev).x - locals.offsetX;
               base.newPosY = getTouches(ev).y - locals.offsetY;
               base.newRelativeX = base.newPosX - locals.relativePos;
               if (typeof base.options.startDragging === "function" && locals.dragging !== true && base.newRelativeX !== 0) {
                   locals.dragging = true;
                   base.options.startDragging.apply(base, [base.$elem]);
               }
               if ((base.newRelativeX > 8 || base.newRelativeX < -8) && (base.browser.isTouch === true)) {
                   if (ev.preventDefault !== undefined) {
                       ev.preventDefault();
                   } else {
                       ev.returnValue = false;
                   }
                   locals.sliding = true;
               }
               if ((base.newPosY > 10 || base.newPosY < -10) && locals.sliding === false) {
                   $(document).off("touchmove.owl");
               }
               minSwipe = function () {
                   return base.newRelativeX / 5;
               };
               maxSwipe = function () {
                   return base.maximumPixels + base.newRelativeX / 5;
               };
               base.newPosX = Math.max(Math.min(base.newPosX, minSwipe()), maxSwipe());
               if (base.browser.support3d === true) {
                   base.transition3d(base.newPosX);
               } else {
                   base.css2move(base.newPosX);
               }
           }
           function dragEnd(event) {
               var ev = event.originalEvent || event || window.event,
                   newPosition,
                   handlers,
                   owlStopEvent;
               ev.target = ev.target || ev.srcElement;
               locals.dragging = false;
               if (base.browser.isTouch !== true) {
                   base.$owlWrapper.removeClass("grabbing");
               }
               if (base.newRelativeX < 0) {
                   base.dragDirection = base.owl.dragDirection = "left";
               } else {
                   base.dragDirection = base.owl.dragDirection = "right";
               }
               if (base.newRelativeX !== 0) {
                   newPosition = base.getNewPosition();
                   base.goTo(newPosition, false, "drag");
                   if (locals.targetElement === ev.target && base.browser.isTouch !== true) {
                       $(ev.target).on("click.disable", function (ev) {
                           ev.stopImmediatePropagation();
                           ev.stopPropagation();
                           ev.preventDefault();
                           $(ev.target).off("click.disable");
                       });
                       handlers = $._data(ev.target, "events").click;
                       owlStopEvent = handlers.pop();
                       handlers.splice(0, 0, owlStopEvent);
                   }
               }
               swapEvents("off");
           }
           base.$elem.on(base.ev_types.start, ".owl-wrapper", dragStart);
       },
       getNewPosition : function () {
           var base = this,
               newPosition = base.closestItem();
           if (newPosition > base.maximumItem) {
               base.currentItem = base.maximumItem;
               newPosition  = base.maximumItem;
           } else if (base.newPosX >= 0) {
               newPosition = 0;
               base.currentItem = 0;
           }
           return newPosition;
       },
       closestItem : function () {
           var base = this,
               array = base.options.scrollPerPage === true ? base.pagesInArray : base.positionsInArray,
               goal = base.newPosX,
               closest = null;
           $.each(array, function (i, v) {
               if (goal - (base.itemWidth / 20) > array[i + 1] && goal - (base.itemWidth / 20) < v && base.moveDirection() === "left") {
                   closest = v;
                   if (base.options.scrollPerPage === true) {
                       base.currentItem = $.inArray(closest, base.positionsInArray);
                   } else {
                       base.currentItem = i;
                   }
               } else if (goal + (base.itemWidth / 20) < v && goal + (base.itemWidth / 20) > (array[i + 1] || array[i] - base.itemWidth) && base.moveDirection() === "right") {
                   if (base.options.scrollPerPage === true) {
                       closest = array[i + 1] || array[array.length - 1];
                       base.currentItem = $.inArray(closest, base.positionsInArray);
                   } else {
                       closest = array[i + 1];
                       base.currentItem = i + 1;
                   }
               }
           });
           return base.currentItem;
       },
       moveDirection : function () {
           var base = this,
               direction;
           if (base.newRelativeX < 0) {
               direction = "right";
               base.playDirection = "next";
           } else {
               direction = "left";
               base.playDirection = "prev";
           }
           return direction;
       },
       customEvents : function () {
           /*jslint unparam: true*/
           var base = this;
           base.$elem.on("owl.next", function () {
               base.next();
           });
           base.$elem.on("owl.prev", function () {
               base.prev();
           });
           base.$elem.on("owl.play", function (event, speed) {
               base.options.autoPlay = speed;
               base.play();
               base.hoverStatus = "play";
           });
           base.$elem.on("owl.stop", function () {
               base.stop();
               base.hoverStatus = "stop";
           });
           base.$elem.on("owl.goTo", function (event, item) {
               base.goTo(item);
           });
           base.$elem.on("owl.jumpTo", function (event, item) {
               base.jumpTo(item);
           });
       },
       stopOnHover : function () {
           var base = this;
           if (base.options.stopOnHover === true && base.browser.isTouch !== true && base.options.autoPlay !== false) {
               base.$elem.on("mouseover", function () {
                   base.stop();
               });
               base.$elem.on("mouseout", function () {
                   if (base.hoverStatus !== "stop") {
                       base.play();
                   }
               });
           }
       },
       lazyLoad : function () {
           var base = this,
               i,
               $item,
               itemNumber,
               $lazyImg,
               follow;
           if (base.options.lazyLoad === false) {
               return false;
           }
           for (i = 0; i < base.itemsAmount; i += 1) {
               $item = $(base.$owlItems[i]);
               if ($item.data("owl-loaded") === "loaded") {
                   continue;
               }
               itemNumber = $item.data("owl-item");
               $lazyImg = $item.find(".lazyOwl");
               if (typeof $lazyImg.data("src") !== "string") {
                   $item.data("owl-loaded", "loaded");
                   continue;
               }
               if ($item.data("owl-loaded") === undefined) {
                   $lazyImg.hide();
                   $item.addClass("loading").data("owl-loaded", "checked");
               }
               if (base.options.lazyFollow === true) {
                   follow = itemNumber >= base.currentItem;
               } else {
                   follow = true;
               }
               if (follow && itemNumber < base.currentItem + base.options.items && $lazyImg.length) {
                   base.lazyPreload($item, $lazyImg);
               }
           }
       },
       lazyPreload : function ($item, $lazyImg) {
           var base = this,
               iterations = 0,
               isBackgroundImg;
           if ($lazyImg.prop("tagName") === "DIV") {
               $lazyImg.css("background-image", "url(" + $lazyImg.data("src") + ")");
               isBackgroundImg = true;
           } else {
               $lazyImg[0].src = $lazyImg.data("src");
           }
           function showImage() {
               $item.data("owl-loaded", "loaded").removeClass("loading");
               $lazyImg.removeAttr("data-src");
               if (base.options.lazyEffect === "fade") {
                   $lazyImg.fadeIn(400);
               } else {
                   $lazyImg.show();
               }
               if (typeof base.options.afterLazyLoad === "function") {
                   base.options.afterLazyLoad.apply(this, [base.$elem]);
               }
           }
           function checkLazyImage() {
               iterations += 1;
               if (base.completeImg($lazyImg.get(0)) || isBackgroundImg === true) {
                   showImage();
               } else if (iterations <= 100) {//if image loads in less than 10 seconds 
                   window.setTimeout(checkLazyImage, 100);
               } else {
                   showImage();
               }
           }
           checkLazyImage();
       },
       autoHeight : function () {
           var base = this,
               $currentimg = $(base.$owlItems[base.currentItem]).find("img"),
               iterations;
           function addHeight() {
               var $currentItem = $(base.$owlItems[base.currentItem]).height();
               base.wrapperOuter.css("height", $currentItem + "px");
               if (!base.wrapperOuter.hasClass("autoHeight")) {
                   window.setTimeout(function () {
                       base.wrapperOuter.addClass("autoHeight");
                   }, 0);
               }
           }
           function checkImage() {
               iterations += 1;
               if (base.completeImg($currentimg.get(0))) {
                   addHeight();
               } else if (iterations <= 100) { //if image loads in less than 10 seconds 
                   window.setTimeout(checkImage, 100);
               } else {
                   base.wrapperOuter.css("height", ""); //Else remove height attribute
               }
           }
           if ($currentimg.get(0) !== undefined) {
               iterations = 0;
               checkImage();
           } else {
               addHeight();
           }
       },
       completeImg : function (img) {
           var naturalWidthType;
           if (!img.complete) {
               return false;
           }
           naturalWidthType = typeof img.naturalWidth;
           if (naturalWidthType !== "undefined" && img.naturalWidth === 0) {
               return false;
           }
           return true;
       },
       onVisibleItems : function () {
           var base = this,
               i;
           if (base.options.addClassActive === true) {
               base.$owlItems.removeClass("active");
           }
           base.visibleItems = [];
           for (i = base.currentItem; i < base.currentItem + base.options.items; i += 1) {
               base.visibleItems.push(i);
               if (base.options.addClassActive === true) {
                   $(base.$owlItems[i]).addClass("active");
               }
           }
           base.owl.visibleItems = base.visibleItems;
       },
       transitionTypes : function (className) {
           var base = this;
           //Currently available: "fade", "backSlide", "goDown", "fadeUp"
           base.outClass = "owl-" + className + "-out";
           base.inClass = "owl-" + className + "-in";
       },
       singleItemTransition : function () {
           var base = this,
               outClass = base.outClass,
               inClass = base.inClass,
               $currentItem = base.$owlItems.eq(base.currentItem),
               $prevItem = base.$owlItems.eq(base.prevItem),
               prevPos = Math.abs(base.positionsInArray[base.currentItem]) + base.positionsInArray[base.prevItem],
               origin = Math.abs(base.positionsInArray[base.currentItem]) + base.itemWidth / 2,
               animEnd = 'webkitAnimationEnd oAnimationEnd MSAnimationEnd animationend';
           base.isTransition = true;
           base.$owlWrapper
               .addClass('owl-origin')
               .css({
                   "-webkit-transform-origin" : origin + "px",
                   "-moz-perspective-origin" : origin + "px",
                   "perspective-origin" : origin + "px"
               });
           function transStyles(prevPos) {
               return {
                   "position" : "relative",
                   "left" : prevPos + "px"
               };
           }
           $prevItem
               .css(transStyles(prevPos, 10))
               .addClass(outClass)
               .on(animEnd, function () {
                   base.endPrev = true;
                   $prevItem.off(animEnd);
                   base.clearTransStyle($prevItem, outClass);
               });
           $currentItem
               .addClass(inClass)
               .on(animEnd, function () {
                   base.endCurrent = true;
                   $currentItem.off(animEnd);
                   base.clearTransStyle($currentItem, inClass);
               });
       },
       clearTransStyle : function (item, classToRemove) {
           var base = this;
           item.css({
               "position" : "",
               "left" : ""
           }).removeClass(classToRemove);
           if (base.endPrev && base.endCurrent) {
               base.$owlWrapper.removeClass('owl-origin');
               base.endPrev = false;
               base.endCurrent = false;
               base.isTransition = false;
           }
       },
       owlStatus : function () {
           var base = this;
           base.owl = {
               "userOptions"   : base.userOptions,
               "baseElement"   : base.$elem,
               "userItems"     : base.$userItems,
               "owlItems"      : base.$owlItems,
               "currentItem"   : base.currentItem,
               "prevItem"      : base.prevItem,
               "visibleItems"  : base.visibleItems,
               "isTouch"       : base.browser.isTouch,
               "browser"       : base.browser,
               "dragDirection" : base.dragDirection
           };
       },
       clearEvents : function () {
           var base = this;
           base.$elem.off(".owl owl mousedown.disableTextSelect");
           $(document).off(".owl owl");
           $(window).off("resize", base.resizer);
       },
       unWrap : function () {
           var base = this;
           if (base.$elem.children().length !== 0) {
               base.$owlWrapper.unwrap();
               base.$userItems.unwrap().unwrap();
               if (base.owlControls) {
                   base.owlControls.remove();
               }
           }
           base.clearEvents();
           base.$elem
               .attr("style", base.$elem.data("owl-originalStyles") || "")
               .attr("class", base.$elem.data("owl-originalClasses"));
       },
       destroy : function () {
           var base = this;
           base.stop();
           window.clearInterval(base.checkVisible);
           base.unWrap();
           base.$elem.removeData();
       },
       reinit : function (newOptions) {
           var base = this,
               options = $.extend({}, base.userOptions, newOptions);
           base.unWrap();
           base.init(options, base.$elem);
       },
       addItem : function (htmlString, targetPosition) {
           var base = this,
               position;
           if (!htmlString) {return false; }
           if (base.$elem.children().length === 0) {
               base.$elem.append(htmlString);
               base.setVars();
               return false;
           }
           base.unWrap();
           if (targetPosition === undefined || targetPosition === -1) {
               position = -1;
           } else {
               position = targetPosition;
           }
           if (position >= base.$userItems.length || position === -1) {
               base.$userItems.eq(-1).after(htmlString);
           } else {
               base.$userItems.eq(position).before(htmlString);
           }
           base.setVars();
       },
       removeItem : function (targetPosition) {
           var base = this,
               position;
           if (base.$elem.children().length === 0) {
               return false;
           }
           if (targetPosition === undefined || targetPosition === -1) {
               position = -1;
           } else {
               position = targetPosition;
           }
           base.unWrap();
           base.$userItems.eq(position).remove();
           base.setVars();
       }
   };
   $.fn.owlCarousel = function (options) {
       return this.each(function () {
           if ($(this).data("owl-init") === true) {
               return false;
           }
           $(this).data("owl-init", true);
           var carousel = Object.create(Carousel);
           carousel.init(options, this);
           $.data(this, "owlCarousel", carousel);
       });
   };
   $.fn.owlCarousel.options = {
       items : 5,
       itemsCustom : false,
       itemsDesktop : [1199, 4],
       itemsDesktopSmall : [979, 3],
       itemsTablet : [768, 2],
       itemsTabletSmall : false,
       itemsMobile : [479, 1],
       singleItem : false,
       itemsScaleUp : false,
       slideSpeed : 200,
       paginationSpeed : 800,
       rewindSpeed : 1000,
       autoPlay : false,
       stopOnHover : false,
       navigation : false,
       navigationText : ["prev", "next"],
       rewindNav : true,
       scrollPerPage : false,
       pagination : true,
       paginationNumbers : false,
       responsive : true,
       responsiveRefreshRate : 200,
       responsiveBaseWidth : window,
       baseClass : "owl-carousel",
       theme : "owl-theme",
       lazyLoad : false,
       lazyFollow : true,
       lazyEffect : "fade",
       autoHeight : false,
       jsonPath : false,
       jsonSuccess : false,
       dragBeforeAnimFinish : true,
       mouseDrag : true,
       touchDrag : true,
       addClassActive : false,
       transitionStyle : false,
       beforeUpdate : false,
       afterUpdate : false,
       beforeInit : false,
       afterInit : false,
       beforeMove : false,
       afterMove : false,
       afterAction : false,
       startDragging : false,
       afterLazyLoad: false
   };
}(jQuery, window, document));