{"version":3,"sources":["framework7.js"],"names":["window","Framework7","params","createPageCallback","callbackName","capitalized","replace","match","toUpperCase","app","pageName","callback","onPage","handleInfiniteScroll","virtualList","inf","$","this","scrollTop","scrollHeight","height","offsetHeight","distance","getAttribute","virtualListContainer","find","onTop","hasClass","indexOf","parseInt","trigger","length","f7VirtualList","reachEnd","_fixIpadBodyScrolLeft","device","ipad","document","body","scrollLeft","setTimeout","version","root","cache","cacheIgnore","cacheIgnoreGetParameters","cacheDuration","preloadPreviousPage","uniqueHistory","uniqueHistoryIgnoreGetParameters","dynamicPageUrl","allowDuplicateUrls","router","routerRemoveTimeout","routerRemoveWithTimeout","pushState","pushStateRoot","undefined","pushStateNoAnimation","pushStateSeparator","pushStateOnLoad","fastClicks","fastClicksDistanceThreshold","fastClicksDelayBetweenClicks","fastClicksExclude","tapHold","tapHoldDelay","tapHoldPreventClicks","activeState","activeStateElements","animateNavBackIcon","swipeBackPage","swipeBackPageThreshold","swipeBackPageActiveArea","swipeBackPageAnimateShadow","swipeBackPageAnimateOpacity","ajaxLinks","externalLinks","sortable","hideNavbarOnPageScroll","hideToolbarOnPageScroll","hideTabbarOnPageScroll","showBarsOnPageScrollEnd","showBarsOnPageScrollTop","swipeout","swipeoutActionsNoFold","swipeoutNoFollow","swipeoutRemoveWithTimeout","smartSelectOpenIn","smartSelectBackText","smartSelectPopupCloseText","smartSelectPickerCloseText","smartSelectSearchbar","smartSelectBackOnSelect","scrollTopOnNavbarClick","scrollTopOnStatusbarClick","swipePanel","swipePanelActiveArea","swipePanelCloseOpposite","swipePanelOnlyClose","swipePanelNoFollow","swipePanelThreshold","panelsCloseByOutside","modalButtonOk","modalButtonCancel","modalUsernamePlaceholder","modalPasswordPlaceholder","modalTitle","modalCloseByOutside","actionsCloseByOutside","popupCloseByOutside","modalPreloaderTitle","modalStack","imagesLazyLoadThreshold","imagesLazyLoadSequential","viewClass","viewMainClass","viewsClass","notificationCloseOnClick","notificationCloseIcon","notificationCloseButtonText","animatePages","templates","template7Data","template7Pages","precompileTemplates","material","materialPageLoadDelay","materialPreloaderSvg","materialPreloaderHtml","materialRipple","materialRippleElements","init","param","Dom7","t7","Template7","_compiledTemplates","eq","addClass","touchEvents","start","support","touch","move","end","ls","localStorage","rtl","css","attr","statusbarOverlay","removeClass","views","View","selector","i","defaults","dynamicNavbar","domCache","linksView","reloadPages","def","view","container","main","contentCache","contextCache","pagesCache","pageElementsCache","f7View","pagesContainer","initialPages","initialPagesUrl","initialNavbars","push","allowPageChange","docLocation","location","href","history","viewURL","split","currentPage","currentPageData","activePage","f7PageData","url","navbarInnerContainer","isScrolling","viewContainerWidth","touchesDiff","touchStartTime","activeNavElements","previousNavElements","activeNavBackIcon","previousNavBackIcon","pageShadow","el","isTouched","isMoved","touchesStart","previousPage","allowViewTouchMove","activeNavbar","previousNavbar","handleTouchStart","e","swipeoutOpenedEl","x","type","targetTouches","pageX","y","pageY","Date","getTime","handleTouchMove","Math","abs","f7PreventSwipeBack","preventSwipeBack","cancel","width","target","parents","is","notFromBorder","offset","left","android","append","closeModal","f7PreventPanelSwipe","preventDefault","inverter","percentage","callbackData","onSwipeBackMove","activePageTranslate","previousPageTranslate","pixelRatio","round","transform","style","opacity","className","activeNavTranslate","f7NavbarRightOffset","previousNavTranslate","f7NavbarLeftOffset","handleTouchEnd","boxShadow","timeDiff","pageChanged","each","translate","sliding","pageBackCallback","pageContainer","position","newPage","oldPage","swipeBack","pageAnimCallback","onSwipeBackBeforeChange","onSwipeBackBeforeReset","transitionEnd","back","afterBack","onSwipeBackAfterChange","onSwipeBackAfterReset","remove","attachEvents","detach","action","passiveListener","passive","capture","detachEvents","mainView","load","options","loadPage","loadContent","content","reloadPage","reload","reloadContent","reloadPreviousPage","reloadPrevious","reloadPreviousContent","refreshPage","ignoreCache","refreshPreviousPage","hideNavbar","showNavbar","hideToolbar","showToolbar","pushStateUrl","pushStateUrlSplit","pushStateAnimatePages","historyState","state","destroy","pluginHook","addView","getCurrentView","index","popoverView","popupView","panelView","appViews","appView","children","currentViews","navbarInitCallback","navbarContainer","parent","f7NavbarInitialized","navbarData","innerContainer","pageData","eventData","page","navbar","reinitNavbar","initNavbar","navbarRemoveCallback","initSearchbar","initNavbarWithCallback","viewContainer","pages","sizeNavbars","navbarInner","n","currLeft","diff","right","center","subnavbar","noLeft","noRight","leftWidth","outerWidth","rightWidth","centerWidth","navbarStyles","styles","navbarWidth","offsetWidth","paddingLeft","paddingRight","onLeft","requiredLeft","activeNavbarBackLink","offsetLeft","centerLeft","toolbarContainer","toolbar","Searchbar","preventSubmit","input","clearButton","cancelButton","searchList","searchIn","searchBy","found","notFound","overlay","ignore","customSearch","removeDiacritics","hideDividers","hideGroups","s","active","isVirtualList","cancelMarginProp","cancelButtonHasMargin","setCancelButtonMargin","transition","show","clientLeft","triggerEvent","eventName","enable","_enable","query","ios","disable","_disable","blur","val","clear","focus","handleInput","value","trim","search","previousQuery","internal","_vlQuery","foundItems","resetFilter","hide","searchAll","items","searchByItem","values","toLowerCase","compareWithText","itemText","text","join","wordsMatch","title","nextElements","nextAll","nextEl","group","notHidden","filterItems","method","f7Searchbar","searchbar","onBeforeRemove","sb","dataset","once","Messagebar","textarea","maxHeight","m","pageContent","pageContentPadding","initialBarHeight","initialAreaHeight","sizeTextarea","clientHeight","newAreaHeight","newBarHeight","maxBarHeight","onBottom","bottom","padding-bottom","textareaTimeout","handleTextarea","clearTimeout","f7Messagebar","messagebar","initPageMessagebar","pageBeforeRemove","mb","off","on","removeFromCache","splice","xhr","get","_url","time","ajax","beforeSend","onAjaxStart","complete","status","responseText","onAjaxComplete","error","onAjaxError","pageCallbacks","pageNames","returnCallbacks","callbacks","removeIndex","toString","pageCallbacksNames","triggerPageCallbacks","allPagesCallbacks","j","pageInitCallback","f7PageInitialized","pageQuery","parseUrlQuery","name","from","context","fromPage","oldNavbarInnerContainer","reinitPage","onPageReinit","preloadOnly","onPageBeforeInit","initPage","onPageInit","pageRemoveCallback","pageContext","onPageBeforeRemove","onPageAfterBack","onPageBack","onPageAfterAnimation","tabBar","onPageBeforeAnimation","initPageMessages","initFormsStorage","initSmartSelects","initPageSwiper","initPullToRefresh","initPageInfiniteScroll","initPageScrollToolbars","initImagesLazyLoad","initPageProgressbar","initPageResizableTextarea","initPageMaterialPreloader","initPageMaterialInputs","initPageMaterialTabbar","reinitPageSwiper","reinitLazyLoad","initPageWithCallback","_remove","temporaryDom","createElement","findElement","notCached","leftPage","rightPage","direction","removeClasses","prepareNavbar","newNavbarInner","oldNavbarInner","newNavbarPosition","slidingOffset","animateNavbars","leftNavbarInner","rightNavbarInner","rightText","preprocess","next","pluginProcess","preroute","isBack","template7Render","t7_ctx","t7_template","t7_rendered_content","contextName","template","template7Cache","compile","_ctx_path","_ctx","data","pageNameMatch","templateName","url_query","key","console","_load","afterAnimation","pushStateClearQueue","historyBecameUnique","pagesInView","reloadPosition","t7_rendered","isDynamicPage","pageElement","innerHTML","ci","filter","prependTo","f7RelatedNavbar","f7RelatedPage","newPageName","viewIndex","lastUrl","_history","lastIndexOf","slice","prev","insertBefore","insertAfter","animationEnd","proceed","abort","_back","animateBack","parseNewPage","setPages","navbarInners","force","pageToRemove","navbarToRemove","removeNavbar","unshift","manipulateDom","prepend","newNavbar","previousURL","pop","inners","oldNavbar","pageUrl","preloadUrl","_modalTemplateTempDiv","modalStackClearQueue","shift","modal","modalHTML","modalTemplate","buttonsHTML","buttons","bold","titleHTML","textHTML","afterTextHTML","afterText","noButtons","verticalButtons","modalButtonsHTML","cssClass","close","onClick","openModal","alert","callbackOk","arguments","confirm","callbackCancel","prompt","modalLogin","username","password","modalPassword","showPreloader","hidePreloader","showIndicator","hideIndicator","actions","groupSelector","buttonSelector","toPopover","isArray","actionsToPopoverTemplate","modalActionsToPopoverTemplate","actionsToPopover","popoverHTML","popover","modalActionsTemplate","button","buttonClass","label","color","bg","disabled","groups","groupIndex","clickTarget","buttonIndex","buttonParams","removeOnClose","sizePopover","top","modalAngle","modalAngleLeft","modalAngleTop","modalWidth","modalHeight","modalAngleSize","targetWidth","targetHeight","outerHeight","targetOffset","targetParentPage","windowHeight","windowWidth","modalTop","modalLeft","modalPosition","diffX","diffY","max","min","_modal","childNodes","classList","add","popup","pickerModal","loginScreen","isModal","removeData","isPopup","isLoginScreen","isPickerModal","marginTop","isPopover","setProgressbar","progress","speed","progressbar","showProgressbar","parseFloat","hideProgressbar","p","allowPanelOpen","openPanel","panelPosition","panelTransitionEnd","transitionEndTarget","panel","display","closePanel","effect","activePanel","initSwipePanels","side","opened","innerWidth","panelOverlay","panelWidth","threshold","overlayOpacity","edge","loadImage","onLoad","src","imageIsLoading","imagesSequence","image","Image","onload","onerror","lazyHandler","lazyLoadImages","isElementInViewport","rect","getBoundingClientRect","innerHeight","placeholderSrc","imagesLazyLoadPlaceholder","f7DestroyImagesLazyLoad","destroyImagesLazyLoad","reinitImagesLazyLoad","html","Messages","autoLayout","newMessagesFirst","scrollMessages","scrollMessagesOnlyOnEdge","messageTemplate","layout","message","onlyPic","nodeType","nodeName","textContent","isSent","appendMessage","props","animate","addMessage","prependMessage","addMessages","newMessages","newMessagesHTML","hasImage","onlyImage","scrollHeightBefore","heightBefore","scrollBefore","onEdge","messages","messagesToReturn","removeMessage","removeMessages","clean","duration","newScroll","currentScroll","f7Messages","allowSwipeout","initSwipeout","swipeoutEl","swipeOutEl","swipeOutContent","actionsRight","actionsLeft","actionsLeftWidth","actionsRightWidth","buttonsLeft","buttonsRight","overswipeRightButton","overswipeLeftButton","noFoldLeft","noFoldRight","openedActions","buttonOffset","swipeoutClose","swipeoutOpen","overswipeLeft","overswipeRight","$button","pow","_buttonOffset","actionsWidth","noFold","newTranslate","click","closed","dir","swipeOutActions","swipeOutActionsWidth","call","onSwipeoutClose","closeTO","swipeoutDelete","virtualIndex","f7VirtualListIndex","deleteItem","sortableToggle","sortableContainer","toggleClass","sortableOpen","sortableClose","initSortable","touchStartY","sortingEl","startIndex","sortingItems","minTop","offsetTop","maxTop","sortingElHeight","currentEl","currentElOffset","currentElHeight","sortingElOffset","oldIndex","newIndex","moveItem","selects","smartSelect","$select","select","valueText","selected","itemAfter","selectedText","smartSelectAddOption","option","selectName","smartSelectOpen","reLayout","scrollToInput","newPaddingBottom","paddingTop","paddingBottom","pageHeight","picker","pageScrollHeight","inputTop","closeOnHTMLClick","checkMaxLength","selectedOptions","maxLength","checked","handleInputs","virtualListInstance","smartSelectItemTemplate","virtualListHeight","item","openIn","backOnSelect","inputName","optionText","inputType","pageInit","detail","f7SmartSelectPicker","closeText","smartSelectData","pageTitle","backText","pickerCloseText","popupCloseText","formTheme","smartSelectFormTheme","navbarTheme","smartSelectNavbarTheme","toolbarTheme","smartSelectToolbarTheme","pickerHeight","smartSelectPickerHeight","$selectData","optionHasMedia","optionImage","optionIcon","optionGroup","optionGroupLabel","optionIsLabel","previousGroup","optionColor","optionClassName","optionData","id","multiple","optionClass","groupLabel","isLabel","icon","hasMedia","checkbox","smartSelectItem","inputsHTML","navbarHTML","navbarLayout","toolbarHTML","noNavbar","noToolbar","noTabbar","smartSelectToolbar","smartSelectToolbarTemplate","inPicker","smartSelectNavbar","smartSelectNavbarTemplate","inPopup","inPage","leftTemplate","smartSelectPopupCloseTemplate","smartSelectBackTemplate","searchbarPlaceholder","searchbarCancel","useSearchbar","searchbarHTML","pageHTML","VirtualList","listBlock","cols","dynamicHeightBufferSize","showFilteredItemsOnly","vl","filteredItems","updatableScroll","osVersion","ul","displayDomCache","tempDomElement","lastRepaintY","fragment","createDocumentFragment","indexes","resetScrollTop","update","rowsPerScreen","rowsBefore","rowsAfter","rowsToRender","listHeight","maxBufferHeight","dynamicHeight","setListSize","heights","itemHeight","ceil","render","forceScrollTop","fromIndex","toIndex","heightBeforeFirstItem","heightBeforeLastItem","itemTop","topPosition","currentFromIndex","currentToIndex","renderItem","onItemBeforeInsert","appendChild","onBeforeClear","onItemsBeforeInsert","onItemsAfterInsert","scrollToItem","listTop","handleScroll","_isVisible","getClientRects","handleResize","appendItems","appendItem","replaceAllItems","replaceItem","prependItems","newCache","cached","prependItem","cachedIndex","leftIndex","rightIndex","indexShift","insertItemBefore","deleteItems","prevIndex","deletedItem","deleteAllItems","clearCache","reinitVirtualList","vlists","vlistInstance","os","pullStarted","wasScrolled","touchId","identifier","touches","dynamicTriggerDistance","triggerDistance","startTranslate","useTranslate","refresh","event","changedTouches","done","pullToRefreshDone","destroyPullToRefresh","eventsTarget","hasNavbar","f7DestroyPullToRefresh","pullToRefreshTrigger","pullToRefreshContent","attachInfiniteScroll","infiniteContent","detachInfiniteScroll","scrollContent","bottomBarHeight","navbarHidden","toolbarHidden","tabbarHidden","tabbar","previousScroll","hasToolbar","hasTabbar","hideTabbar","toolbarHeight","tabbarHeight","f7ScrollToolbarsHandler","destroyScrollToolbars","handler","materialTabbarSetHighlight","activeLink","tabLinkWidth","highlightTranslate","tabbarSetHighlight","showTab","tab","tabLink","newTab","tabs","isAnimatedTabs","tabTranslate","swiper","isSwipeableTabs","activeIndex","slideTo","oldTab","oldTabLink","oldTabId","accordionToggle","accordionClose","accordionOpen","list","expandedItem","initFastClicks","findActivableElement","activable","isInsideScrollableView","prop","activeTimeout","rippleTimeout","addActive","activableElement","removeActive","isFormElement","nodes","androidNeedsBlur","noBlur","activeElement","targetNeedsFastClick","$el","targetNeedsFocus","tag","skipInputs","readOnly","targetNeedsPrevent","prevent","handleMouseDown","which","touchStartX","rippleTouchStart","handleMouseMove","rippleTouchMove","handleMouseUp","rippleTouchEnd","findRippleElement","needsRipple","rippleParent","createRipple","box","diameter","rippleWave","rippleTransform","removeRipple","toRemove","removeTimeout","rippleTarget","sendClick","evt","createEvent","eventType","targetElement","initMouseEvent","screenX","screenY","clientX","clientY","forwardedTouchEvent","dispatchEvent","tapHoldFired","tapHoldTimeout","needsFastClickTimeOut","needsFastClick","trackClick","selection","getSelection","rangeCount","focusNode","isCollapsed","activeSelection","scrollParent","f7ScrollTop","timeStamp","lastClickTime","_isMoved","cancelable","webView","handleTouchCancel","handleClick","allowClick","stopImmediatePropagation","stopPropagation","androidChrome","addEventListener","initClickEvents","handleScrollTop","clicked","isLink","handleClicks","open","clickedData","pickerToClose","pickerToOpen","isTabLink","confirmTitle","closeOnCancel","accordionItem","validUrl","JSON","parse","preventScrolling","initResize","resize","orientationchange","minimalUi","orientation","formsData","formStoreData","formId","formJSON","stringify","formDeleteData","removeItem","formGetData","formToData","form","formData","skipTypes","skipNames","formToJSON","formFromData","formFromJSON","storeForm","forms","contentType","FormData","serializeObject","success","resizeTextarea","resizableTextarea","f7DestroyResizableTextarea","destroyResizableTextarea","textareas","itemInput","notInputs","initMaterialWatchInputs","addFocusState","els","removeFocusState","watchChangeState","pushStateQueue","queue","stateUrl","stateContent","statePageName","initPushState","handlePopState","blockPopstate","readyState","Swiper","destroySwiperOnRemove","slider","destroySwiper","swipers","initialSlide","onSlideChangeStart","slides","_slider","sliders","sliderInstance","PhotoBrowser","pb","photos","spaceBetween","zoom","zoomMax","zoomMin","exposition","expositionHideCaptions","theme","swipeToClose","backLinkText","ofText","loop","lazyLoading","lazyLoadingInPrevNext","lazyLoadingOnTransitionStart","maxZoom","minZoom","iconsColorClass","iconsColor","preloaderColorClass","photoTemplate","photoLazyTemplate","lazyPhotoTemplate","objectTemplate","captionTemplate","navbarTemplate","toolbarTemplate","htmlTemplate","openIndex","onPopupClose","onOpen","swiperContainer","onClose","swiperWrapper","onSliderTransitionStart","current","total","loopedSlides","isBeginning","isEnd","captions","captionsContainer","captionIndex","previousSlideVideo","previousIndex","pause","onTransitionStart","onSliderTransitionEnd","onTransitionEnd","sliderSettings","nextButton","prevButton","indexButton","preloadImages","onTap","toggleExposition","onDoubleTap","onSlideChangeEnd","onLazyImageLoad","slide","img","onLazyImageReady","onTouchStart","swipeCloseTouchStart","onTouchMoveOpposite","swipeCloseTouchMove","onTouchEnd","swipeCloseTouchEnd","exposed","enableExposition","disableExposition","swipeToCloseDiff","swipeToCloseStart","swipeToCloseCurrent","swipeToCloseActiveSlide","swipeToCloseTimeStart","swipeToCloseIsTouched","allowSwipeToClose","swipeToCloseStarted","onSwipeToClose","photoBrowser","Autocomplete","handleInputValue","a","source","itemsHTML","limit","regExp","RegExp","itemValue","valueProperty","dropdownItemTemplate","textProperty","dropdownPlaceholderText","dropdownPlaceholderTemplate","dropdown","handleDropdownClick","clickedItem","updateInputValueOnSelect","onChange","searchbarPlaceholderText","searchbarCancelText","notFoundText","expandInput","preloaderColor","preloader","opener","itemTemplate","dropdownTemplate","positionDropDown","listBlockOffsetLeft","inputOffsetLeft","inputOffsetTop","updateValues","valuesHTML","onSearch","aValue","isValues","initEvents","autocomplete","Picker","convertToPopover","onlyInPopover","inline","inPopover","resizeCols","divider","calcSize","setValue","openOnInput","onPickerClose","destroyPickerCol","updateValuesOnMomentum","updateValuesOnTouchmove","rotateEffect","momentumRatio","freeMode","closeByOutsideClick","inputReadOnly","toolbarCloseText","initialized","originBug","navigator","userAgent","arrValues","valueIndex","updateValue","forceValues","newValue","newDisplayValue","displayValue","formatValue","initPickerCol","colElement","updateItems","updateDuringScroll","animationFrameId","requestAnimationFrame","col","touchCurrentY","allowItemClick","currentTranslate","getTranslate","wrapper","cancelAnimationFrame","returnTo","minTranslate","maxTranslate","velocityTranslate","prevTranslate","velocityTime","touchEndTime","velocity","floor","colContainer","colIndex","wrapperHeight","itemsHeight","replaceValues","displayValues","destroyEvents","newItemsHTML","columnHTML","colWidth","colHeight","valueCallbacks","newActiveIndex","previousActiveIndex","selectedItem","itemOffsetTop","translateOffset","itemOffset","itemsFit","angle","f7DestroyPickerCol","onlyItems","columnItemsHTML","textAlign","pickerHTML","pickerClass","colsHTML","f7Picker","Calendar","formatDate","date","year","getFullYear","month","getMonth","month1","day","getDate","weekDay","getDay","dateFormat","substring","monthNames","monthNamesShort","dayNames","dayNamesShort","destroyCalendarEvents","firstDay","weekendDays","rangePicker","minDate","maxDate","events","rangesClasses","touchMove","closeOnSelect","monthPicker","monthPickerTemplate","yearPicker","yearPickerTemplate","weekHeader","headerPlaceholder","header","footer","headerTemplate","footerTemplate","isH","animating","addValue","inValuesIndex","sort","b","onlyHeader","inputValue","valueDate","initCalendarEvents","monthsTranslate","touchCurrentX","wrapperWidth","resetMonth","nextMonth","prevMonth","handleDayClick","dateYear","dateMonth","dateDay","onDayClick","prevYear","nextYear","f7DestroyCalendarEvents","dateInRange","dayDate","range","to","daysInMonth","d","monthHTML","daysInPrevMonth","firstDayOfMonthIndex","k","hasEvent","currentValues","rows","dayIndex","today","setHours","rowHTML","dayNumber","weekDayIndex","dayYear","dayMonth","updateCurrentMonthYear","currentMonth","months","currentYear","onMonthChangeStart","currentIndex","onMonthYearChangeStart","onMonthChangeEnd","rebuildBoth","nextMonthHTML","prevMonthHTML","newMonthHTML","setMonthsTranslate","onMonthAdd","onMonthYearChangeEnd","prevMonthTranslate","currentMonthTranslate","nextMonthTranslate","nextDate","nextDateTime","transitionEndCallback","prevDate","prevDateTime","setYearMonth","targetDate","currentDate","monthTranslate","wrapperTranslate","layoutDate","currentMonthHTML","monthsHTML","weekHeaderHTML","dayName","headerHTML","footerHTML","f7Calendar","calendar","_tempNotificationElement","addNotification","media","notificationMedia","notificationTitle","subtitle","notificationSubtitle","closeIcon","hold","notificationHold","closeOnClick","notificationTemplate","notification","closeNotification","additionalClass","marginBottom","initTemplate7Templates","_plugins","initPlugins","plugin","plugins","hook","hooks","pluginPrevent","prevents","process","processed","getDeviceInfo","onAppInit","arr","_this","tempParent","toCreate","querySelectorAll","getElementById","prototype","classes","contains","toggle","attrs","setAttribute","attrName","removeAttr","removeAttribute","propName","dom7ElementDataStorage","dataKey","attributes","toCamelCase","elStyle","webkitTransform","MsTransform","msTransform","MozTransform","OTransform","webkitTransitionDuration","MsTransitionDuration","msTransitionDuration","MozTransitionDuration","OTransitionDuration","transitionDuration","targetSelector","listener","handleLiveEvent","dom7LiveListeners","liveListener","removeEventListener","proxy","dom","CustomEvent","bubbles","initEvent","fireCallBack","includeMargins","getPropertyValue","clientTop","pageYOffset","pageXOffset","getComputedStyle","matchedItems","compareWith","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","child","previousSibling","returnIndex","newChild","tempDiv","firstChild","appendTo","before","parentNode","cloneNode","after","nextSibling","nextElementSibling","nextEls","previousElementSibling","prevAll","prevEls","siblings","unique","closest","foundElements","removeChild","toAdd","empty","createMethod","notTrigger","shortcuts","globalAjaxOptions","ajaxSetup","optionName","optionValue","_jsonpRequests","fireAjaxCallback","async","user","headers","xhrFields","statusCode","processData","dataType","timeout","globalOptionName","globalOptionValue","defaultValue","paramsPrefix","_method","stringData","abortTimeout","now","callbackSplit","requestUrl","addVars","script","querySelector","XMLHttpRequest","requestParameters","postData","postDataInstances","ArrayBuffer","Blob","Document","constructor","boundary","setRequestHeader","_data","_newData","headerName","headerCallback","crossDomain","test","$2","host","fieldName","fieldValue","xhrTimeout","responseData","err","parseerror","responseType","response","onabort","send","methods","Object","apply","obj","hasOwnProperty","var_name","_parents","encodeURIComponent","var_value","resultArray","separator","newParents","toPush","string","group1","axis","matrix","curTransform","curStyle","transformMatrix","WebKitCSSMatrix","map","m41","m42","webkitRequestAnimationFrame","mozRequestAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","supportTouch","DocumentTouch","defaultDiacriticsRemovalap","base","letters","diacriticsMap","str","fn","scrollTo","easing","startTime","easeProgress","cos","PI","animateTop","currentTop","newTop","animateLeft","currentLeft","newLeft","maxLeft","scrollWidth","Animate7","elements","easingProgress","stop","frameId","animate7Instance","que","began","begin","_elements","currentValue","initialValue","finalValue","_container","unit","propsDone","keys","elementsDone","initialFullValue","finalFullValue","foundInstance","supportsPassive","opts","defineProperty","ua","ipod","iphone","osVersionArr","statusBar","screen","classNames","devicePixelRatio","major","isFunction","func","_escape","escape","helperToSlices","shiftIndex","helperParts","slices","blockQuoteRegExp","openingQuote","part","quoteDoubleRexExp","quoteSingleRexExp","hashParts","hashName","hashContent","hash","stringToBlocks","blocks","_blocks","block","helperSlices","helperName","isPartial","helperContext","helperHash","helperContent","elseContent","toSkip","foundClosed","foundElse","depth","inverseContent","getCompileFn","getCompileInverse","getCompileVar","ctx","variable","parts","levelsUp","newDepth","isFinite","getCompiledArguments","contextArray","t","Error","resultString","compiledArguments","helpers","eval","compiled","partials","_partial","partialName","if","inverse","unless","ret","reverse","first","last","with","delimiter","delimeter","js","expression","js_compare","condition","instance","rendered","registerHelper","unregisterHelper","registerPartial","unregisterPartial","autoplay","autoplayDelay","activeSlide","autoplayTimeoutId","fixLoop","_slideNext","emit","autoplayStopOnLast","stopAutoplay","_slideTo","findElementInEvent","_el","initObserver","ObserverFunc","MutationObserver","WebkitMutationObserver","observer","mutations","forEach","mutation","onResize","observe","childList","characterData","observers","setParallaxTransform","pX","pY","rtlFactor","isHorizontal","normalizeEventName","touchEventsTarget","autoplayDisableOnInteraction","iOSEdgeSwipeDetection","iOSEdgeSwipeThreshold","freeModeMomentum","freeModeMomentumRatio","freeModeMomentumBounce","freeModeMomentumBounceRatio","freeModeMomentumVelocityRatio","freeModeSticky","freeModeMinimumVelocity","autoHeight","setWrapperSize","virtualTranslate","coverflow","rotate","stretch","modifier","slideShadows","flip","limitRotation","cube","shadow","shadowOffset","shadowScale","fade","crossFade","parallax","zoomToggle","scrollbar","scrollbarHide","scrollbarDraggable","scrollbarSnapOnRelease","keyboardControl","mousewheelControl","mousewheelReleaseOnEdges","mousewheelInvert","mousewheelForceToAxis","mousewheelSensitivity","mousewheelEventsTarged","hashnav","hashnavWatchState","replaceState","breakpoints","slidesPerView","slidesPerColumn","slidesPerColumnFill","slidesPerGroup","centeredSlides","slidesOffsetBefore","slidesOffsetAfter","roundLengths","touchRatio","touchAngle","simulateTouch","shortSwipes","longSwipes","longSwipesRatio","longSwipesMs","followFinger","onlyExternal","touchMoveStopPropagation","touchReleaseOnEdges","uniqueNavElements","pagination","paginationElement","paginationClickable","paginationHide","paginationBulletRender","paginationProgressRender","paginationFractionRender","paginationCustomRender","paginationType","resistance","resistanceRatio","watchSlidesProgress","watchSlidesVisibility","grabCursor","preventClicks","preventClicksPropagation","slideToClickedSlide","lazyLoadingInPrevNextAmount","updateOnImagesReady","loopAdditionalSlides","control","controlInverse","controlBy","normalizeSlideIndex","allowSwipeToPrev","allowSwipeToNext","swipeHandler","noSwiping","noSwipingClass","passiveListeners","containerModifierClass","slideClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","bulletClass","bulletActiveClass","buttonDisabledClass","paginationCurrentClass","paginationTotalClass","paginationHiddenClass","paginationProgressbarClass","paginationClickableClass","paginationModifierClass","lazyLoadingClass","lazyStatusLoadingClass","lazyStatusLoadedClass","lazyPreloaderClass","notificationClass","preloaderClass","zoomContainerClass","observeParents","a11y","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","runCallbacksOnInit","initialVirtualTranslate","originalParams","jQuery","deepParam","deepDef","Zepto","currentBreakpoint","getActiveBreakpoint","point","breakpoint","points","setBreakpoint","breakPointsParams","needsReLoop","destroyLoop","reLoop","flexbox","transforms3d","paginationContainer","wrongRTL","lockSwipeToNext","unsetGrabCursor","lockSwipeToPrev","lockSwipes","unlockSwipeToNext","setGrabCursor","unlockSwipeToPrev","unlockSwipes","moving","cursor","imagesToLoad","imagesLoaded","imgElement","srcset","sizes","checkForComplete","onReady","_onReady","currentSrc","autoplaying","autoplayPaused","startAutoplay","pauseAutoplay","snapGrid","updateAutoHeight","activeSlides","newHeight","updateContainerSize","clientWidth","size","updateSlidesSize","slidesGrid","slidesSizesGrid","slidePosition","prevSlideSize","virtualSize","marginLeft","marginRight","slidesNumberEvenToRows","slideSize","slidesPerRow","numFullColumns","newSlideOrderIndex","column","row","-webkit-box-ordinal-group","-moz-box-ordinal-group","-ms-flex-order","-webkit-order","order","swiperSlideSize","newSlidesGrid","updateSlidesOffset","swiperSlideOffset","updateSlidesProgress","offsetCenter","slideProgress","slideBefore","slideAfter","isVisible","updateProgress","translatesDiff","wasBeginning","wasEnd","updateActiveIndex","snapIndex","updateClasses","updateRealIndex","realIndex","nextSlide","prevSlide","bullets","scale","scaleX","scaleY","updatePagination","paginationHTML","numberOfBullets","initPagination","updateTranslate","forceSetTranslate","setWrapperTranslate","set","translated","controller","spline","forceUpdatePagination","slideChangedBySlideTo","lazy","touchEventsDesktop","pointerEnabled","msPointerEnabled","actionDom","moveCapture","nested","browser","ie","onTouchMove","onClickNext","onEnterKey","onClickPrev","onClickIndex","slideNext","slidePrev","updateClickedSlide","slideFound","clickedSlide","clickedIndex","slideToIndex","allowTouchCallbacks","allowThresholdMove","clickTimeout","allowMomentumBounce","formElements","velocities","startX","startY","currentX","currentY","isTouchEvent","startMoving","originalEvent","swipeDirection","preventedByNestedSwiper","atan2","ieTouch","getWrapperTranslate","setWrapperTransition","disableParentSwiper","currentPos","lastMoveEvent","velocityEvent","momentumDuration","momentumDistance","newPosition","afterBouncePosition","doBounce","bounceAmount","slideReset","stopIndex","groupSize","ratio","slideIndex","runCallbacks","lteIE9","setHistory","setHash","_slidePrev","disableTouchControl","enableTouchControl","byController","effects","setTransition","z","setTranslate","initObservers","containerParents","disconnectObservers","disconnect","createLoop","prependSlides","appendSlides","updatePosition","appendSlide","prependSlide","removeSlide","slidesIndexes","indexToRemove","removeAllSlides","tx","ty","slideOpacity","eventTriggered","triggerEvents","rotateY","rotateX","zIndex","shadowBefore","shadowAfter","cubeShadow","wrapperRotate","slideAngle","tz","-webkit-transform-origin","-moz-transform-origin","-ms-transform-origin","transform-origin","shadowAngle","multiplier","sin","scale1","scale2","zFactor","isSafari","isUiWebView","slideOffset","offsetMultiplier","translateZ","translateY","translateX","slideTransform","ws","perspectiveOrigin","initialImageLoaded","loadImageInSlide","loadInDuplicate","_img","background","slideOriginalIndex","originalSlide","duplicatedSlide","amount","spv","maxIndex","minIndex","setDragPosition","pointerPosition","track","dragSize","positionMin","moveDivider","positionMax","dragStart","dragTimeout","drag","dragMove","returnValue","dragEnd","draggableEvents","enableDraggable","disableDraggable","trackSize","newPos","newSize","LinearSpline","lastIndex","i1","i3","interpolate","x2","binarySearch","guess","array","getInterpolateFunction","c","setControlledTranslate","controlledTranslate","controlled","setControlledTransition","parallaxDuration","currentScale","isScaling","gesture","slideWidth","slideHeight","imageWrap","minX","minY","maxX","maxY","touchesCurrent","prevPositionX","prevPositionY","prevTime","getDistanceBetweenTouches","x1","y1","y2","sqrt","onGestureStart","gestures","scaleStart","onGestureChange","scaleMove","onGestureEnd","scaledWidth","scaledHeight","momentumDurationX","momentumDurationY","momentumDistanceX","newPositionX","momentumDistanceY","newPositionY","toggleZoom","touchX","touchY","offsetX","offsetY","imageWidth","imageHeight","translateMinX","translateMinY","translateMaxX","translateMaxY","callPlugins","emitterEventListeners","_handler","makeFocusable","addRole","role","addLabel","keyCode","notify","liveRegion","bullet","enableKeyboardControl","enableMousewheelControl","hashnavReplaceState","cleanupStyles","deleteInstance","disableKeyboardControl","disableMousewheelControl","setHistoryPopState","msMaxTouchPoints","maxTouchPoints","div","getElementsByTagName","Modernizr","csstransforms3d"],"mappings":"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","file":"framework7.min.js","sourcesContent":["/**\n * Framework7 1.5.0\n * Full featured mobile HTML framework for building iOS & Android apps\n * \n * http://framework7.io/\n * \n * Copyright 2016, Vladimir Kharlampidi\n * The iDangero.us\n * http://www.idangero.us/\n * \n * Licensed under MIT\n * \n * Released on: November 8, 2016\n */\n(function () {\n\n    'use strict';\n    /*===========================\n    Framework 7\n    ===========================*/\n    window.Framework7 = function (params) {\n        // App\n        var app = this;\n    \n        // Version\n        app.version = '1.5.0';\n    \n        // Default Parameters\n        app.params = {\n            //\n            root: 'body',\n            //\n            cache: true,\n            cacheIgnore: [],\n            cacheIgnoreGetParameters: false,\n            cacheDuration: 1000 * 60 * 10, // Ten minutes\n            preloadPreviousPage: true,\n            uniqueHistory: false,\n            uniqueHistoryIgnoreGetParameters: false,\n            dynamicPageUrl: 'content-{{index}}',\n            allowDuplicateUrls: false,\n            router: true,\n            routerRemoveTimeout: false,\n            routerRemoveWithTimeout: false,\n            // Push State\n            pushState: false,\n            pushStateRoot: undefined,\n            pushStateNoAnimation: false,\n            pushStateSeparator: '#!/',\n            pushStateOnLoad: true,\n            // Fast clicks\n            fastClicks: true,\n            fastClicksDistanceThreshold: 10,\n            fastClicksDelayBetweenClicks: 50,\n            fastClicksExclude: '', // CSS selector\n            // Tap Hold\n            tapHold: false,\n            tapHoldDelay: 750,\n            tapHoldPreventClicks: true,\n            // Active State\n            activeState: true,\n            activeStateElements: 'a, button, label, span',\n            // Animate Nav Back Icon\n            animateNavBackIcon: false,\n            // Swipe Back\n            swipeBackPage: true,\n            swipeBackPageThreshold: 0,\n            swipeBackPageActiveArea: 30,\n            swipeBackPageAnimateShadow: true,\n            swipeBackPageAnimateOpacity: true,\n            // Ajax\n            ajaxLinks: undefined, // or CSS selector\n            // External Links\n            externalLinks: '.external', // CSS selector\n            // Sortable\n            sortable: true,\n            // Scroll toolbars\n            hideNavbarOnPageScroll: false,\n            hideToolbarOnPageScroll: false,\n            hideTabbarOnPageScroll: false,\n            showBarsOnPageScrollEnd: true,\n            showBarsOnPageScrollTop: true,\n            // Swipeout\n            swipeout: true,\n            swipeoutActionsNoFold: false,\n            swipeoutNoFollow: false,\n            swipeoutRemoveWithTimeout: false,\n            // Smart Select Back link template\n            smartSelectOpenIn: 'page', // or 'popup' or 'picker'\n            smartSelectBackText: 'Back',\n            smartSelectPopupCloseText: 'Close',\n            smartSelectPickerCloseText: 'Done',\n            smartSelectSearchbar: false,\n            smartSelectBackOnSelect: false,\n            // Tap Navbar or Statusbar to scroll to top\n            scrollTopOnNavbarClick: false,\n            scrollTopOnStatusbarClick: false,\n            // Panels\n            swipePanel: false, // or 'left' or 'right'\n            swipePanelActiveArea: 0,\n            swipePanelCloseOpposite: true,\n            swipePanelOnlyClose: false,\n            swipePanelNoFollow: false,\n            swipePanelThreshold: 0,\n            panelsCloseByOutside: true,\n            // Modals\n            modalButtonOk: 'OK',\n            modalButtonCancel: 'Cancel',\n            modalUsernamePlaceholder: 'Username',\n            modalPasswordPlaceholder: 'Password',\n            modalTitle: 'Framework7',\n            modalCloseByOutside: false,\n            actionsCloseByOutside: true,\n            popupCloseByOutside: true,\n            modalPreloaderTitle: 'Loading... ',\n            modalStack: true,\n            // Lazy Load\n            imagesLazyLoadThreshold: 0,\n            imagesLazyLoadSequential: true,\n            // Name space\n            viewClass: 'view',\n            viewMainClass: 'view-main',\n            viewsClass: 'views',\n            // Notifications defaults\n            notificationCloseOnClick: false,\n            notificationCloseIcon: true,\n            notificationCloseButtonText: 'Close',\n            // Animate Pages\n            animatePages: true,\n            // Template7\n            templates: {},\n            template7Data: {},\n            template7Pages: false,\n            precompileTemplates: false,\n            // Material\n            material: false,\n            materialPageLoadDelay: 0,\n            materialPreloaderSvg: '<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"75\" width=\"75\" viewbox=\"0 0 75 75\"><circle cx=\"37.5\" cy=\"37.5\" r=\"33.5\" stroke-width=\"8\"/></svg>',\n            materialPreloaderHtml:\n                '<span class=\"preloader-inner\">' +\n                    '<span class=\"preloader-inner-gap\"></span>' +\n                    '<span class=\"preloader-inner-left\">' +\n                        '<span class=\"preloader-inner-half-circle\"></span>' +\n                    '</span>' +\n                    '<span class=\"preloader-inner-right\">' +\n                        '<span class=\"preloader-inner-half-circle\"></span>' +\n                    '</span>' +\n                '</span>',\n            materialRipple: true,\n            materialRippleElements: '.ripple, a.link, a.item-link, .button, .modal-button, .tab-link, .label-radio, .label-checkbox, .actions-modal-button, a.searchbar-clear, a.floating-button, .floating-button > a, .speed-dial-buttons a',\n            // Auto init\n            init: true,\n        };\n    \n        // Extend defaults with parameters\n        for (var param in params) {\n            app.params[param] = params[param];\n        }\n    \n        // DOM lib\n        var $ = Dom7;\n    \n        // Template7 lib\n        var t7 = Template7;\n        app._compiledTemplates = {};\n    \n        // App Root\n        app.root = $(app.params.root);\n        app.root.eq(0).addClass('framework7-root');\n    \n        // Touch events\n        app.touchEvents = {\n            start: app.support.touch ? 'touchstart' : 'mousedown',\n            move: app.support.touch ? 'touchmove' : 'mousemove',\n            end: app.support.touch ? 'touchend' : 'mouseup'\n        };\n    \n        // Link to local storage\n        app.ls = window.localStorage;\n    \n        // RTL\n        app.rtl = $('body').css('direction') === 'rtl';\n        if (app.rtl) $('html').attr('dir', 'rtl');\n    \n        // Overwrite statusbar overlay\n        if (typeof app.params.statusbarOverlay !== 'undefined') {\n            if (app.params.statusbarOverlay) $('html').addClass('with-statusbar-overlay');\n            else $('html').removeClass('with-statusbar-overlay');\n        }\n    \n\n        /*======================================================\n        ************   Views   ************\n        ======================================================*/\n        app.views = [];\n        var View = function (selector, params) {\n            var defaults = {\n                dynamicNavbar: false,\n                domCache: false,\n                linksView: undefined,\n                reloadPages: false,\n                uniqueHistory: app.params.uniqueHistory,\n                uniqueHistoryIgnoreGetParameters: app.params.uniqueHistoryIgnoreGetParameters,\n                allowDuplicateUrls: app.params.allowDuplicateUrls,\n                swipeBackPage: app.params.swipeBackPage,\n                swipeBackPageAnimateShadow: app.params.swipeBackPageAnimateShadow,\n                swipeBackPageAnimateOpacity: app.params.swipeBackPageAnimateOpacity,\n                swipeBackPageActiveArea: app.params.swipeBackPageActiveArea,\n                swipeBackPageThreshold: app.params.swipeBackPageThreshold,\n                animatePages: app.params.animatePages,\n                preloadPreviousPage: app.params.preloadPreviousPage\n            };\n            var i;\n        \n            // Params\n            params = params || {};\n        \n            // Disable dynamic navbar for material theme\n            if (params.dynamicNavbar && app.params.material) params.dynamicNavbar = false;\n        \n            // Extend params with defaults\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined') {\n                    params[def] = defaults[def];\n                }\n            }\n            // View\n            var view = this;\n            view.params = params;\n        \n            // Selector\n            view.selector = selector;\n        \n            // Container\n            var container = $(selector);\n            view.container = container[0];\n        \n            // Fix Selector\n        \n            if (typeof selector !== 'string') {\n                // Supposed to be HTMLElement or Dom7\n                selector = (container.attr('id') ? '#' + container.attr('id') : '') + (container.attr('class') ? '.' + container.attr('class').replace(/ /g, '.').replace('.active', '') : '');\n                view.selector = selector;\n            }\n        \n            // Is main\n            view.main = container.hasClass(app.params.viewMainClass);\n        \n            // Content cache\n            view.contentCache = {};\n        \n            // Context cache\n            view.contextCache = {};\n        \n            // Pages cache\n            view.pagesCache = {};\n            view.pageElementsCache = {};\n        \n            // Store View in element for easy access\n            container[0].f7View = view;\n        \n            // Pages\n            view.pagesContainer = container.find('.pages')[0];\n            view.initialPages = [];\n            view.initialPagesUrl = [];\n            view.initialNavbars = [];\n            if (view.params.domCache) {\n                var initialPages = container.find('.page');\n                for (i = 0; i < initialPages.length; i++) {\n                    view.initialPages.push(initialPages[i]);\n                    view.initialPagesUrl.push('#' + initialPages.eq(i).attr('data-page'));\n                }\n                if (view.params.dynamicNavbar) {\n                    var initialNavbars = container.find('.navbar-inner');\n                    for (i = 0; i < initialNavbars.length; i++) {\n                        view.initialNavbars.push(initialNavbars[i]);\n                    }\n                }\n        \n            }\n        \n            view.allowPageChange = true;\n        \n            // Location\n            var docLocation = document.location.href;\n        \n            // History\n            view.history = [];\n            var viewURL = docLocation;\n            var pushStateSeparator = app.params.pushStateSeparator;\n            var pushStateRoot = app.params.pushStateRoot;\n            if (app.params.pushState && view.main) {\n                if (pushStateRoot) {\n                    viewURL = pushStateRoot;\n                }\n                else {\n                    if (pushStateSeparator && viewURL.indexOf(pushStateSeparator) >= 0 && viewURL.indexOf(pushStateSeparator + '#') < 0) viewURL = viewURL.split(pushStateSeparator)[0];\n                }\n        \n            }\n        \n            // Active Page\n            var currentPage, currentPageData;\n            if (!view.activePage) {\n                currentPage = $(view.pagesContainer).find('.page-on-center');\n                if (currentPage.length === 0) {\n                    currentPage = $(view.pagesContainer).find('.page:not(.cached)');\n                    currentPage = currentPage.eq(currentPage.length - 1);\n                }\n                if (currentPage.length > 0) {\n                    currentPageData = currentPage[0].f7PageData;\n                }\n            }\n        \n            // View startup URL\n            if (view.params.domCache && currentPage) {\n                view.url = container.attr('data-url') || view.params.url || '#' + currentPage.attr('data-page');   \n                view.pagesCache[view.url] = currentPage.attr('data-page');\n            }\n            else view.url = container.attr('data-url') || view.params.url || viewURL;\n        \n            // Update current page Data\n            if (currentPageData) {\n                currentPageData.view = view;\n                currentPageData.url = view.url;\n                if (view.params.domCache && view.params.dynamicNavbar && !currentPageData.navbarInnerContainer) {\n                    currentPageData.navbarInnerContainer = view.initialNavbars[view.initialPages.indexOf(currentPageData.container)];\n                }\n                view.activePage = currentPageData;\n                currentPage[0].f7PageData = currentPageData;\n            }\n        \n            // Store to history main view's url\n            if (view.url) {\n                view.history.push(view.url);\n            }\n        \n            // Touch events\n            var isTouched = false,\n                isMoved = false,\n                touchesStart = {},\n                isScrolling,\n                activePage = [],\n                previousPage = [],\n                viewContainerWidth,\n                touchesDiff,\n                allowViewTouchMove = true,\n                touchStartTime,\n                activeNavbar = [],\n                previousNavbar = [],\n                activeNavElements,\n                previousNavElements,\n                activeNavBackIcon,\n                previousNavBackIcon,\n                dynamicNavbar,\n                pageShadow,\n                el;\n        \n            view.handleTouchStart = function (e) {\n                if (!allowViewTouchMove || !view.params.swipeBackPage || isTouched || app.swipeoutOpenedEl || !view.allowPageChange) return;\n                isMoved = false;\n                isTouched = true;\n                isScrolling = undefined;\n                touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n                touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                touchStartTime = (new Date()).getTime();\n                dynamicNavbar = view.params.dynamicNavbar && container.find('.navbar-inner').length > 1;\n            };\n        \n            view.handleTouchMove = function (e) {\n                if (!isTouched) return;\n                var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                if (typeof isScrolling === 'undefined') {\n                    isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n                }\n                if (isScrolling || e.f7PreventSwipeBack || app.preventSwipeBack) {\n                    isTouched = false;\n                    return;\n                }\n                if (!isMoved) {\n                    var cancel = false;\n                    // Calc values during first move fired\n                    viewContainerWidth = container.width();\n                    var target = $(e.target);\n                    var swipeout = target.hasClass('swipeout') ? target : target.parents('.swipeout');\n                    if (swipeout.length > 0) {\n                        if (!app.rtl && swipeout.find('.swipeout-actions-left').length > 0) cancel = true;\n                        if (app.rtl && swipeout.find('.swipeout-actions-right').length > 0) cancel = true;\n                    }\n                    activePage = target.is('.page') ? target : target.parents('.page');\n                    if (activePage.hasClass('no-swipeback')) cancel = true;\n                    previousPage = container.find('.page-on-left:not(.cached)');\n                    var notFromBorder = touchesStart.x - container.offset().left > view.params.swipeBackPageActiveArea;\n                    if (app.rtl) {\n                        notFromBorder = touchesStart.x < container.offset().left - container[0].scrollLeft + viewContainerWidth - view.params.swipeBackPageActiveArea;\n                    }\n                    else {\n                        notFromBorder = touchesStart.x - container.offset().left > view.params.swipeBackPageActiveArea;\n                    }\n                    if (notFromBorder) cancel = true;\n                    if (previousPage.length === 0 || activePage.length === 0) cancel = true;\n                    if (cancel) {\n                        isTouched = false;\n                        return;\n                    }\n        \n                    if (view.params.swipeBackPageAnimateShadow && !app.device.android) {\n                        pageShadow = activePage.find('.swipeback-page-shadow');\n                        if (pageShadow.length === 0) {\n                            pageShadow = $('<div class=\"swipeback-page-shadow\"></div>');\n                            activePage.append(pageShadow);\n                        }\n                    }\n        \n                    if (dynamicNavbar) {\n                        activeNavbar = container.find('.navbar-on-center:not(.cached)');\n                        previousNavbar = container.find('.navbar-on-left:not(.cached)');\n                        activeNavElements = activeNavbar.find('.left, .center, .right, .subnavbar, .fading');\n                        previousNavElements = previousNavbar.find('.left, .center, .right, .subnavbar, .fading');\n                        if (app.params.animateNavBackIcon) {\n                            activeNavBackIcon = activeNavbar.find('.left.sliding .back .icon');\n                            previousNavBackIcon = previousNavbar.find('.left.sliding .back .icon');\n                        }\n                    }\n        \n                    // Close/Hide Any Picker\n                    if ($('.picker-modal.modal-in').length > 0) {\n                        app.closeModal($('.picker-modal.modal-in'));\n                    }\n                }\n                e.f7PreventPanelSwipe = true;\n                isMoved = true;\n                e.preventDefault();\n        \n                // RTL inverter\n                var inverter = app.rtl ? -1 : 1;\n        \n                // Touches diff\n                touchesDiff = (pageX - touchesStart.x - view.params.swipeBackPageThreshold) * inverter;\n                if (touchesDiff < 0) touchesDiff = 0;\n                var percentage = touchesDiff / viewContainerWidth;\n        \n                // Swipe Back Callback\n                var callbackData = {\n                    percentage: percentage,\n                    activePage: activePage[0],\n                    previousPage: previousPage[0],\n                    activeNavbar: activeNavbar[0],\n                    previousNavbar: previousNavbar[0]\n                };\n                if (view.params.onSwipeBackMove) {\n                    view.params.onSwipeBackMove(callbackData);\n                }\n                container.trigger('swipeBackMove', callbackData);\n        \n                // Transform pages\n                var activePageTranslate = touchesDiff * inverter;\n                var previousPageTranslate = (touchesDiff / 5 - viewContainerWidth / 5) * inverter;\n                if (app.device.pixelRatio === 1) {\n                    activePageTranslate = Math.round(activePageTranslate);\n                    previousPageTranslate = Math.round(previousPageTranslate);\n                }\n        \n                activePage.transform('translate3d(' + activePageTranslate + 'px,0,0)');\n                if (view.params.swipeBackPageAnimateShadow && !app.device.android) pageShadow[0].style.opacity = 1 - 1 * percentage;\n        \n                previousPage.transform('translate3d(' + previousPageTranslate + 'px,0,0)');\n                if (view.params.swipeBackPageAnimateOpacity) previousPage[0].style.opacity = 0.9 + 0.1 * percentage;\n        \n                // Dynamic Navbars Animation\n                if (dynamicNavbar) {\n                    var i;\n                    for (i = 0; i < activeNavElements.length; i++) {\n                        el = $(activeNavElements[i]);\n                        if (!el.is('.subnavbar.sliding')) el[0].style.opacity = (1 - percentage * 1.3);\n                        if (el[0].className.indexOf('sliding') >= 0) {\n                            var activeNavTranslate = percentage * el[0].f7NavbarRightOffset;\n                            if (app.device.pixelRatio === 1) activeNavTranslate = Math.round(activeNavTranslate);\n                            el.transform('translate3d(' + activeNavTranslate + 'px,0,0)');\n                            if (app.params.animateNavBackIcon) {\n                                if (el[0].className.indexOf('left') >= 0 && activeNavBackIcon.length > 0) {\n                                    activeNavBackIcon.transform('translate3d(' + -activeNavTranslate + 'px,0,0)');\n                                }\n                            }\n                        }\n                    }\n                    for (i = 0; i < previousNavElements.length; i++) {\n                        el = $(previousNavElements[i]);\n                        if (!el.is('.subnavbar.sliding')) el[0].style.opacity = percentage * 1.3 - 0.3;\n                        if (el[0].className.indexOf('sliding') >= 0) {\n                            var previousNavTranslate = el[0].f7NavbarLeftOffset * (1 - percentage);\n                            if (app.device.pixelRatio === 1) previousNavTranslate = Math.round(previousNavTranslate);\n                            el.transform('translate3d(' + previousNavTranslate + 'px,0,0)');\n                            if (app.params.animateNavBackIcon) {\n                                if (el[0].className.indexOf('left') >= 0 && previousNavBackIcon.length > 0) {\n                                    previousNavBackIcon.transform('translate3d(' + -previousNavTranslate + 'px,0,0)');\n                                }\n                            }\n                        }\n                    }\n                }\n            };\n        \n            view.handleTouchEnd = function (e) {\n                if (!isTouched || !isMoved) {\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n                isTouched = false;\n                isMoved = false;\n                if (touchesDiff === 0) {\n                    $([activePage[0], previousPage[0]]).transform('').css({opacity: '', boxShadow: ''});\n                    if (dynamicNavbar) {\n                        activeNavElements.transform('').css({opacity: ''});\n                        previousNavElements.transform('').css({opacity: ''});\n                        if (activeNavBackIcon && activeNavBackIcon.length > 0) activeNavBackIcon.transform('');\n                        if (previousNavBackIcon && activeNavBackIcon.length > 0) previousNavBackIcon.transform('');\n                    }\n                    return;\n                }\n                var timeDiff = (new Date()).getTime() - touchStartTime;\n                var pageChanged = false;\n                // Swipe back to previous page\n                if (\n                        timeDiff < 300 && touchesDiff > 10 ||\n                        timeDiff >= 300 && touchesDiff > viewContainerWidth / 2\n                    ) {\n                    activePage.removeClass('page-on-center').addClass('page-on-right');\n                    previousPage.removeClass('page-on-left').addClass('page-on-center');\n                    if (dynamicNavbar) {\n                        activeNavbar.removeClass('navbar-on-center').addClass('navbar-on-right');\n                        previousNavbar.removeClass('navbar-on-left').addClass('navbar-on-center');\n                    }\n                    pageChanged = true;\n                }\n                // Reset custom styles\n                // Add transitioning class for transition-duration\n                $([activePage[0], previousPage[0]]).transform('').css({opacity: '', boxShadow: ''}).addClass('page-transitioning');\n                if (dynamicNavbar) {\n                    activeNavElements.css({opacity: ''})\n                    .each(function () {\n                        var translate = pageChanged ? this.f7NavbarRightOffset : 0;\n                        var sliding = $(this);\n                        sliding.transform('translate3d(' + translate + 'px,0,0)');\n                        if (app.params.animateNavBackIcon) {\n                            if (sliding.hasClass('left') && activeNavBackIcon.length > 0) {\n                                activeNavBackIcon.addClass('page-transitioning').transform('translate3d(' + -translate + 'px,0,0)');\n                            }\n                        }\n        \n                    }).addClass('page-transitioning');\n        \n                    previousNavElements.transform('').css({opacity: ''}).each(function () {\n                        var translate = pageChanged ? 0 : this.f7NavbarLeftOffset;\n                        var sliding = $(this);\n                        sliding.transform('translate3d(' + translate + 'px,0,0)');\n                        if (app.params.animateNavBackIcon) {\n                            if (sliding.hasClass('left') && previousNavBackIcon.length > 0) {\n                                previousNavBackIcon.addClass('page-transitioning').transform('translate3d(' + -translate + 'px,0,0)');\n                            }\n                        }\n                    }).addClass('page-transitioning');\n                }\n                allowViewTouchMove = false;\n                view.allowPageChange = false;\n                // Swipe Back Callback\n                var callbackData = {\n                    activePage: activePage[0],\n                    previousPage: previousPage[0],\n                    activeNavbar: activeNavbar[0],\n                    previousNavbar: previousNavbar[0]\n                };\n                if (pageChanged) {\n                    // Update View's URL\n                    var url = view.history[view.history.length - 2];\n                    view.url = url;\n        \n                    // Page before animation callback\n                    app.pageBackCallback('before', view, {pageContainer: activePage[0], url: url, position: 'center', newPage: previousPage, oldPage: activePage, swipeBack: true});\n                    app.pageAnimCallback('before', view, {pageContainer: previousPage[0], url: url, position: 'left', newPage: previousPage, oldPage: activePage, swipeBack: true});\n        \n                    if (view.params.onSwipeBackBeforeChange) {\n                        view.params.onSwipeBackBeforeChange(callbackData);\n                    }\n                    container.trigger('swipeBackBeforeChange', callbackData);\n                }\n                else {\n                    if (view.params.onSwipeBackBeforeReset) {\n                        view.params.onSwipeBackBeforeReset(callbackData);\n                    }\n                    container.trigger('swipeBackBeforeReset', callbackData);\n                }\n        \n                activePage.transitionEnd(function () {\n                    $([activePage[0], previousPage[0]]).removeClass('page-transitioning');\n                    if (dynamicNavbar) {\n                        activeNavElements.removeClass('page-transitioning').css({opacity: ''});\n                        previousNavElements.removeClass('page-transitioning').css({opacity: ''});\n                        if (activeNavBackIcon && activeNavBackIcon.length > 0) activeNavBackIcon.removeClass('page-transitioning');\n                        if (previousNavBackIcon && previousNavBackIcon.length > 0) previousNavBackIcon.removeClass('page-transitioning');\n                    }\n                    allowViewTouchMove = true;\n                    view.allowPageChange = true;\n                    if (pageChanged) {\n                        if (app.params.pushState && view.main) history.back();\n                        // Page after animation callback\n                        app.pageBackCallback('after', view, {pageContainer: activePage[0], url: url, position: 'center', newPage: previousPage, oldPage: activePage, swipeBack: true});\n                        app.pageAnimCallback('after', view, {pageContainer: previousPage[0], url: url, position: 'left', newPage: previousPage, oldPage: activePage, swipeBack: true});\n                        app.router.afterBack(view, activePage, previousPage);\n        \n                        if (view.params.onSwipeBackAfterChange) {\n                            view.params.onSwipeBackAfterChange(callbackData);\n                        }\n                        container.trigger('swipeBackAfterChange', callbackData);\n                    }\n                    else {\n                        if (view.params.onSwipeBackAfterReset) {\n                            view.params.onSwipeBackAfterReset(callbackData);\n                        }\n                        container.trigger('swipeBackAfterReset', callbackData);\n                    }\n                    if (pageShadow && pageShadow.length > 0) pageShadow.remove();\n                });\n            };\n            view.attachEvents = function (detach) {\n                var action = detach ? 'off' : 'on';\n                var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? {passive: true, capture: false} : false;\n                container[action](app.touchEvents.start, view.handleTouchStart, passiveListener);\n                container[action](app.touchEvents.move, view.handleTouchMove);\n                container[action](app.touchEvents.end, view.handleTouchEnd, passiveListener);\n            };\n            view.detachEvents = function () {\n                view.attachEvents(true);\n            };\n        \n            // Init\n            if (view.params.swipeBackPage && !app.params.material) {\n                view.attachEvents();\n            }\n        \n            // Add view to app\n            app.views.push(view);\n            if (view.main) app.mainView = view;\n        \n            // Router\n            view.router = {\n                load: function (options) {\n                    return app.router.load(view, options);\n                },\n                back: function (options) {\n                    return app.router.back(view, options);\n                },\n                // Shortcuts\n                loadPage: function (options) {\n                    options = options || {};\n                    if (typeof options === 'string') {\n                        var url = options;\n                        options = {};\n                        if (url && url.indexOf('#') === 0 && view.params.domCache) {\n                            options.pageName = url.split('#')[1];\n                        }\n                        else options.url = url;\n                    }\n                    return app.router.load(view, options);\n                },\n                loadContent: function (content) {\n                    return app.router.load(view, {content: content});\n                },\n                reloadPage: function (url) {\n                    return app.router.load(view, {url: url, reload: true});\n                },\n                reloadContent: function (content) {\n                    return app.router.load(view, {content: content, reload: true});\n                },\n                reloadPreviousPage: function (url) {\n                    return app.router.load(view, {url: url, reloadPrevious: true, reload: true});\n                },\n                reloadPreviousContent: function (content) {\n                    return app.router.load(view, {content: content, reloadPrevious: true, reload: true});\n                },\n                refreshPage: function () {\n                    var options = {\n                        url: view.url,\n                        reload: true,\n                        ignoreCache: true\n                    };\n                    if (options.url && options.url.indexOf('#') === 0) {\n                        if (view.params.domCache && view.pagesCache[options.url]) {\n                            options.pageName = view.pagesCache[options.url];\n                            options.url = undefined;\n                            delete options.url;\n                        }\n                        else if (view.contentCache[options.url]) {\n                            options.content = view.contentCache[options.url];\n                            options.url = undefined;\n                            delete options.url;\n                        }\n                    }\n                    return app.router.load(view, options);\n                },\n                refreshPreviousPage: function () {\n                    var options = {\n                        url: view.history[view.history.length - 2],\n                        reload: true,\n                        reloadPrevious: true,\n                        ignoreCache: true\n                    };\n                    if (options.url && options.url.indexOf('#') === 0 && view.params.domCache && view.pagesCache[options.url]) {\n                        options.pageName = view.pagesCache[options.url];\n                        options.url = undefined;\n                        delete options.url;\n                    }\n                    return app.router.load(view, options);\n                }\n            };\n        \n            // Aliases for temporary backward compatibility\n            view.loadPage = view.router.loadPage;\n            view.loadContent = view.router.loadContent;\n            view.reloadPage = view.router.reloadPage;\n            view.reloadContent = view.router.reloadContent;\n            view.reloadPreviousPage = view.router.reloadPreviousPage;\n            view.reloadPreviousContent = view.router.reloadPreviousContent;\n            view.refreshPage = view.router.refreshPage;\n            view.refreshPreviousPage = view.router.refreshPreviousPage;\n            view.back = view.router.back;\n        \n            // Bars methods\n            view.hideNavbar = function () {\n                return app.hideNavbar(container.find('.navbar'));\n            };\n            view.showNavbar = function () {\n                return app.showNavbar(container.find('.navbar'));\n            };\n            view.hideToolbar = function () {\n                return app.hideToolbar(container.find('.toolbar'));\n            };\n            view.showToolbar = function () {\n                return app.showToolbar(container.find('.toolbar'));\n            };\n        \n            // Push State on load\n            if (app.params.pushState && app.params.pushStateOnLoad && view.main) {\n                var pushStateUrl;\n                var pushStateUrlSplit = docLocation.split(pushStateSeparator)[1];\n                if (pushStateRoot) {\n                    pushStateUrl = docLocation.split(app.params.pushStateRoot + pushStateSeparator)[1];\n                }\n                else if (pushStateSeparator && docLocation.indexOf(pushStateSeparator) >= 0 && docLocation.indexOf(pushStateSeparator + '#') < 0) {\n                    pushStateUrl = pushStateUrlSplit;\n                }\n                var pushStateAnimatePages = app.params.pushStateNoAnimation ? false : undefined;\n                var historyState = history.state;\n                if (pushStateUrl) {\n                    if (pushStateUrl.indexOf('#') >= 0 && view.params.domCache && historyState && historyState.pageName && 'viewIndex' in historyState) {\n                        app.router.load(view, {pageName: historyState.pageName, url: historyState.url, animatePages: pushStateAnimatePages, pushState: false});\n                    }\n                    else if (pushStateUrl.indexOf('#') >= 0 && view.params.domCache && view.initialPagesUrl.indexOf(pushStateUrl) >= 0) {\n                        app.router.load(view, {pageName: pushStateUrl.replace('#',''), animatePages: pushStateAnimatePages, pushState: false});\n                    }\n                    else app.router.load(view, {url: pushStateUrl, animatePages: pushStateAnimatePages, pushState: false});\n                }\n                else if (view.params.domCache && docLocation.indexOf(pushStateSeparator + '#') >= 0) {\n                    if (historyState && historyState.pageName && 'viewIndex' in historyState) {\n                        app.router.load(view, {pageName: historyState.pageName, url: historyState.url, animatePages: pushStateAnimatePages, pushState: false});\n                    }\n                    else if (pushStateSeparator && pushStateUrlSplit.indexOf('#') === 0) {\n                        if (view.initialPagesUrl.indexOf(pushStateUrlSplit)) {\n                            app.router.load(view, {pageName: pushStateUrlSplit.replace('#', ''), animatePages: pushStateAnimatePages, pushState: false});\n                        }\n                    }\n                }\n            }\n        \n            // Destroy\n            view.destroy = function () {\n                view.detachEvents();\n                view = undefined;\n            };\n        \n            // Plugin hook\n            app.pluginHook('addView', view);\n        \n            // Return view\n            return view;\n        };\n        \n        app.addView = function (selector, params) {\n            return new View(selector, params);\n        };\n        \n        app.getCurrentView = function (index) {\n            var popoverView = $('.popover.modal-in .view');\n            var popupView = $('.popup.modal-in .view');\n            var panelView = $('.panel.active .view');\n            var appViews = $('.views');\n            // Find active view as tab\n            var appView = appViews.children('.view');\n            // Propably in tabs or split view\n            if (appView.length > 1) {\n                if (appView.hasClass('tab')) {\n                    // Tabs\n                    appView = appViews.children('.view.active');\n                }\n                else {\n                    // Split View, leave appView intact\n                }\n            }\n            if (popoverView.length > 0 && popoverView[0].f7View) return popoverView[0].f7View;\n            if (popupView.length > 0 && popupView[0].f7View) return popupView[0].f7View;\n            if (panelView.length > 0 && panelView[0].f7View) return panelView[0].f7View;\n            if (appView.length > 0) {\n                if (appView.length === 1 && appView[0].f7View) return appView[0].f7View;\n                if (appView.length > 1) {\n                    var currentViews = [];\n                    for (var i = 0; i < appView.length; i++) {\n                        if (appView[i].f7View) currentViews.push(appView[i].f7View);\n                    }\n                    if (currentViews.length > 0 && typeof index !== 'undefined') return currentViews[index];\n                    if (currentViews.length > 1) return currentViews;\n                    if (currentViews.length === 1) return currentViews[0];\n                    return undefined;\n                }\n            }\n            return undefined;\n        };\n        \n\n        /*======================================================\n        ************   Navbars && Toolbars   ************\n        ======================================================*/\n        // On Navbar Init Callback\n        app.navbarInitCallback = function (view, pageContainer, navbarContainer, navbarInnerContainer) {\n            if (!navbarContainer && navbarInnerContainer) navbarContainer = $(navbarInnerContainer).parent('.navbar')[0];\n            if (!navbarInnerContainer || navbarInnerContainer.f7NavbarInitialized && view && !view.params.domCache) return;\n            var navbarData = {\n                container: navbarContainer,\n                innerContainer: navbarInnerContainer\n            };\n            var pageData = pageContainer && pageContainer.f7PageData;\n        \n            var eventData = {\n                page: pageData,\n                navbar: navbarData\n            };\n        \n            if (navbarInnerContainer.f7NavbarInitialized && ((view && view.params.domCache) || (!view && $(navbarContainer).parents('.popup, .popover, .login-screen, .modal, .actions-modal, .picker-modal').length > 0))) {\n                // Reinit Navbar\n                app.reinitNavbar(navbarContainer, navbarInnerContainer);\n        \n                // Plugin hook\n                app.pluginHook('navbarReinit', eventData);\n        \n                // Event\n                $(navbarInnerContainer).trigger('navbarReinit', eventData);\n                return;\n            }\n            navbarInnerContainer.f7NavbarInitialized = true;\n            // Before Init\n            app.pluginHook('navbarBeforeInit', navbarData, pageData);\n            $(navbarInnerContainer).trigger('navbarBeforeInit', eventData);\n        \n            // Initialize Navbar\n            app.initNavbar(navbarContainer, navbarInnerContainer);\n        \n            // On init\n            app.pluginHook('navbarInit', navbarData, pageData);\n            $(navbarInnerContainer).trigger('navbarInit', eventData);\n        };\n        // Navbar Remove Callback\n        app.navbarRemoveCallback = function (view, pageContainer, navbarContainer, navbarInnerContainer) {\n            if (!navbarContainer && navbarInnerContainer) navbarContainer = $(navbarInnerContainer).parent('.navbar')[0];\n            var navbarData = {\n                container: navbarContainer,\n                innerContainer: navbarInnerContainer\n            };\n            var pageData;\n            if (pageContainer) {\n                pageData = pageContainer.f7PageData;\n            }\n        \n            var eventData = {\n                page: pageData,\n                navbar: navbarData\n            };\n            app.pluginHook('navbarBeforeRemove', navbarData, pageData);\n            $(navbarInnerContainer).trigger('navbarBeforeRemove', eventData);\n            navbarData = null;\n            pageData = null;\n        };\n        app.initNavbar = function (navbarContainer, navbarInnerContainer) {\n            // Init Subnavbar Searchbar\n            if (app.initSearchbar) app.initSearchbar(navbarInnerContainer);\n        };\n        app.reinitNavbar = function (navbarContainer, navbarInnerContainer) {\n            // Re init navbar methods\n        };\n        app.initNavbarWithCallback = function (navbarContainer) {\n            navbarContainer = $(navbarContainer);\n            var viewContainer = navbarContainer.parents('.' + app.params.viewClass);\n            var view;\n            if (viewContainer.length === 0) return;\n            if (navbarContainer.parents('.navbar-through').length === 0 && viewContainer.find('.navbar-through').length === 0) return;\n            view = viewContainer[0].f7View || undefined;\n        \n            navbarContainer.find('.navbar-inner').each(function () {\n                var navbarInnerContainer = this;\n                var pageContainer;\n                if ($(navbarInnerContainer).attr('data-page')) {\n                    // For dom cache\n                    pageContainer = viewContainer.find('.page[data-page=\"' + $(navbarInnerContainer).attr('data-page') + '\"]')[0];\n                }\n                if (!pageContainer) {\n                    var pages = viewContainer.find('.page');\n                    if (pages.length === 1) {\n                        pageContainer = pages[0];\n                    }\n                    else {\n                        viewContainer.find('.page').each(function () {\n                            if (this.f7PageData && this.f7PageData.navbarInnerContainer === navbarInnerContainer) {\n                                pageContainer = this;\n                            }\n                        });\n                    }\n                }\n                app.navbarInitCallback(view, pageContainer, navbarContainer[0], navbarInnerContainer);\n            });\n        };\n        \n        // Size Navbars\n        app.sizeNavbars = function (viewContainer) {\n            if (app.params.material) return;\n            var navbarInner = viewContainer ? $(viewContainer).find('.navbar .navbar-inner:not(.cached)') : $('.navbar .navbar-inner:not(.cached)');\n            navbarInner.each(function () {\n                var n = $(this);\n                if (n.hasClass('cached')) return;\n                var left = app.rtl ? n.find('.right') : n.find('.left'),\n                    right = app.rtl ? n.find('.left') : n.find('.right'),\n                    center = n.find('.center'),\n                    subnavbar = n.find('.subnavbar'),\n                    noLeft = left.length === 0,\n                    noRight = right.length === 0,\n                    leftWidth = noLeft ? 0 : left.outerWidth(true),\n                    rightWidth = noRight ? 0 : right.outerWidth(true),\n                    centerWidth = center.outerWidth(true),\n                    navbarStyles = n.styles(),\n                    navbarWidth = n[0].offsetWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10),\n                    onLeft = n.hasClass('navbar-on-left'),\n                    currLeft, diff;\n        \n                if (noRight) {\n                    currLeft = navbarWidth - centerWidth;\n                }\n                if (noLeft) {\n                    currLeft = 0;\n                }\n                if (!noLeft && !noRight) {\n                    currLeft = (navbarWidth - rightWidth - centerWidth + leftWidth) / 2;\n                }\n                var requiredLeft = (navbarWidth - centerWidth) / 2;\n                if (navbarWidth - leftWidth - rightWidth > centerWidth) {\n                    if (requiredLeft < leftWidth) {\n                        requiredLeft = leftWidth;\n                    }\n                    if (requiredLeft + centerWidth > navbarWidth - rightWidth) {\n                        requiredLeft = navbarWidth - rightWidth - centerWidth;\n                    }\n                    diff = requiredLeft - currLeft;\n                }\n                else {\n                    diff = 0;\n                }\n                // RTL inverter\n                var inverter = app.rtl ? -1 : 1;\n        \n                if (center.hasClass('sliding')) {\n                    center[0].f7NavbarLeftOffset = -(currLeft + diff) * inverter;\n                    center[0].f7NavbarRightOffset = (navbarWidth - currLeft - diff - centerWidth) * inverter;\n                    if (onLeft) {\n                        if (app.params.animateNavBackIcon) {\n                            var activeNavbarBackLink = n.parent().find('.navbar-on-center').find('.left.sliding .back .icon ~ span');\n                            if (activeNavbarBackLink.length > 0) {\n                                center[0].f7NavbarLeftOffset += activeNavbarBackLink[0].offsetLeft;\n                            }\n                        }\n                        center.transform('translate3d(' + center[0].f7NavbarLeftOffset + 'px, 0, 0)');\n                    }\n                }\n                if (!noLeft && left.hasClass('sliding')) {\n                    if (app.rtl) {\n                        left[0].f7NavbarLeftOffset = -(navbarWidth - left[0].offsetWidth) / 2 * inverter;\n                        left[0].f7NavbarRightOffset = leftWidth * inverter;\n                    }\n                    else {\n                        left[0].f7NavbarLeftOffset = -leftWidth;\n                        left[0].f7NavbarRightOffset = (navbarWidth - left[0].offsetWidth) / 2;\n                        if (app.params.animateNavBackIcon && left.find('.back .icon').length > 0) {\n                            left[0].f7NavbarRightOffset -= left.find('.back .icon')[0].offsetWidth;\n                        }\n                    }\n                    if (onLeft) left.transform('translate3d(' + left[0].f7NavbarLeftOffset + 'px, 0, 0)');\n                }\n                if (!noRight && right.hasClass('sliding')) {\n                    if (app.rtl) {\n                        right[0].f7NavbarLeftOffset = -rightWidth * inverter;\n                        right[0].f7NavbarRightOffset = (navbarWidth - right[0].offsetWidth) / 2 * inverter;\n                    }\n                    else {\n                        right[0].f7NavbarLeftOffset = -(navbarWidth - right[0].offsetWidth) / 2;\n                        right[0].f7NavbarRightOffset = rightWidth;\n                    }\n                    if (onLeft) right.transform('translate3d(' + right[0].f7NavbarLeftOffset + 'px, 0, 0)');\n                }\n                if (subnavbar.length && subnavbar.hasClass('sliding')) {\n                    subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : -subnavbar[0].offsetWidth;\n                    subnavbar[0].f7NavbarRightOffset = -subnavbar[0].f7NavbarLeftOffset;\n                }\n        \n                // Center left\n                var centerLeft = diff;\n                if (app.rtl && noLeft && noRight && center.length > 0) centerLeft = -centerLeft;\n                center.css({left: centerLeft + 'px'});\n                \n            });\n        };\n        \n        // Hide/Show Navbars/Toolbars\n        app.hideNavbar = function (navbarContainer) {\n            $(navbarContainer).addClass('navbar-hidden');\n            return true;\n        };\n        app.showNavbar = function (navbarContainer) {\n            var navbar = $(navbarContainer);\n            navbar.addClass('navbar-hiding').removeClass('navbar-hidden').transitionEnd(function () {\n                navbar.removeClass('navbar-hiding');\n            });\n            return true;\n        };\n        app.hideToolbar = function (toolbarContainer) {\n            $(toolbarContainer).addClass('toolbar-hidden');\n            return true;\n        };\n        app.showToolbar = function (toolbarContainer) {\n            var toolbar = $(toolbarContainer);\n            toolbar.addClass('toolbar-hiding').removeClass('toolbar-hidden').transitionEnd(function () {\n                toolbar.removeClass('toolbar-hiding');\n            });\n        };\n        \n\n        /*======================================================\n        ************   Searchbar   ************\n        ======================================================*/\n        var Searchbar = function (container, params) {\n            var defaults = {\n                input: null,\n                clearButton: null,\n                cancelButton: null,\n                searchList: null,\n                searchIn: '.item-title',\n                searchBy: '',\n                found: null,\n                notFound: null,\n                overlay: null,\n                ignore: '.searchbar-ignore',\n                customSearch: false,\n                removeDiacritics: false,\n                hideDividers: true,\n                hideGroups: true,\n                /* Callbacks\n                onSearch\n                onEnable\n                onDisable\n                onClear\n                */\n        \n            };\n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined' || params[def] === null) {\n                    params[def] = defaults[def];\n                }\n            }\n            \n            // Instance\n            var s = this;\n        \n            // Material\n            s.material = app.params.material;\n        \n            // Params\n            s.params = params;\n        \n            // Container\n            container = $(container);\n            s.container = container;\n        \n            // Active\n            s.active = false;\n        \n            // Input\n            s.input = s.params.input ? $(s.params.input) : s.container.find('input[type=\"search\"]');\n            s.clearButton = s.params.clearButton ? $(s.params.clearButton) : s.container.find('.searchbar-clear');\n            s.cancelButton = s.params.cancelButton ? $(s.params.cancelButton) : s.container.find('.searchbar-cancel');\n        \n            // Search List\n            s.searchList = $(s.params.searchList);\n        \n            // Is Virtual List\n            s.isVirtualList = s.searchList.hasClass('virtual-list');\n        \n            // Is In Page\n            s.pageContainer = s.container.parents('.page').eq(0);\n        \n            // Overlay\n            if (!s.params.overlay) {\n                s.overlay = s.pageContainer.length > 0 ? s.pageContainer.find('.searchbar-overlay') : $('.searchbar-overlay');\n            }\n            else {\n                s.overlay = $(s.params.overlay);\n            }\n            // Found and not found\n            if (!s.params.found) {\n                s.found = s.pageContainer.length > 0 ? s.pageContainer.find('.searchbar-found') : $('.searchbar-found');\n            }\n            else {\n                s.found = $(s.params.found);\n            }\n            if (!s.params.notFound) {\n                s.notFound = s.pageContainer.length > 0 ? s.pageContainer.find('.searchbar-not-found') : $('.searchbar-not-found');\n            }\n            else {\n                s.notFound = $(s.params.notFound);\n            }\n        \n            // Set Cancel button\n            var cancelMarginProp = app.rtl ? 'margin-left' : 'margin-right';\n            var cancelButtonHasMargin = false;\n            s.setCancelButtonMargin = function () {\n                s.cancelButton.transition(0).show();\n                s.cancelButton.css(cancelMarginProp, -s.cancelButton[0].offsetWidth + 'px');\n                var clientLeft = s.cancelButton[0].clientLeft;\n                s.cancelButton.transition('');\n                cancelButtonHasMargin = true;\n            };\n        \n            // Trigger\n            s.triggerEvent = function (eventName, callbackName, eventData) {\n                s.container.trigger(eventName, eventData);\n                if (s.searchList.length > 0) s.searchList.trigger(eventName, eventData);\n                if (callbackName && s.params[callbackName]) s.params[callbackName](s, eventData);\n            };\n        \n            // Enable/disalbe\n            s.enable = function (e) {\n                function _enable() {\n                    if ((s.searchList.length || s.params.customSearch) && !s.container.hasClass('searchbar-active') && !s.query) s.overlay.addClass('searchbar-overlay-active');\n                    s.container.addClass('searchbar-active');\n                    if (s.cancelButton.length > 0 && !s.material) {\n                        if (!cancelButtonHasMargin) {\n                            s.setCancelButtonMargin();\n                        }\n                        s.cancelButton.css(cancelMarginProp, '0px');\n                    }\n                    s.triggerEvent('enableSearch', 'onEnable');\n                    s.active = true;\n                }\n                if (app.device.ios && !app.params.material && e && e.type === 'focus') {\n                    setTimeout(function () {\n                        _enable();\n                    }, 400);\n                }\n                else {\n                    _enable();\n                }\n            };\n        \n            s.disable = function () {\n                s.input.val('').trigger('change');\n                s.container.removeClass('searchbar-active searchbar-not-empty');\n                if (s.cancelButton.length > 0 && !s.material) s.cancelButton.css(cancelMarginProp, -s.cancelButton[0].offsetWidth + 'px');\n        \n                if (s.searchList.length || s.params.customSearch) s.overlay.removeClass('searchbar-overlay-active');\n        \n                s.active = false;\n                function _disable() {\n                    s.input.blur();\n                }\n                if (app.device.ios) {\n                    setTimeout(function () {\n                        _disable();\n                    }, 400);\n                }\n                else {\n                    _disable();\n                }\n                s.triggerEvent('disableSearch', 'onDisable');\n            };\n        \n            // Clear\n            s.clear = function (e) {\n                if (!s.query && e && $(e.target).hasClass('searchbar-clear')) {\n                    s.disable();\n                    return;\n                }\n                s.input.val('').trigger('change').focus();\n                s.triggerEvent('clearSearch', 'onClear');\n            };\n        \n            // Search\n            s.handleInput = function () {\n                setTimeout(function () {\n                    var value = s.input.val().trim();\n                    if ((s.searchList.length > 0 || s.params.customSearch) && (s.params.searchIn || s.isVirtualList)) s.search(value, true);\n                }, 0);\n            };\n        \n            var previousQuery = '';\n            var virtualList;\n            s.search = function (query, internal) {\n                if (query.trim() === previousQuery) return;\n                previousQuery = query.trim();\n        \n                if (!internal) {\n                    if (!s.active) {\n                        s.enable();\n                    }\n                    s.input.val(query);\n                }\n                s.query = s.value = query;\n                // Add active/inactive classes on overlay\n                if (query.length === 0) {\n                    s.container.removeClass('searchbar-not-empty');\n                    if (s.searchList.length && s.container.hasClass('searchbar-active')) s.overlay.addClass('searchbar-overlay-active');\n                }\n                else {\n                    s.container.addClass('searchbar-not-empty');\n                    if (s.searchList.length && s.container.hasClass('searchbar-active')) s.overlay.removeClass('searchbar-overlay-active');\n                }\n        \n                if (s.params.customSearch) {\n                    s.triggerEvent('search', 'onSearch', {query: query});\n                    return;\n                }\n        \n                var foundItems = [], _vlQuery;\n                if (s.isVirtualList) {\n                    virtualList = s.searchList[0].f7VirtualList;\n                    if (query.trim() === '') {\n                        virtualList.resetFilter();\n                        s.notFound.hide();\n                        s.found.show();\n                        return;\n                    }\n                    _vlQuery = s.params.removeDiacritics ? $.removeDiacritics(query) : query;\n                    if (virtualList.params.searchAll) {\n                        foundItems = virtualList.params.searchAll(_vlQuery, virtualList.items) || [];\n                    }\n                    else if (virtualList.params.searchByItem) {\n                        for (var i = 0; i < virtualList.items.length; i++) {\n                            if(virtualList.params.searchByItem(_vlQuery, i, virtualList.params.items[i])) {\n                                foundItems.push(i);\n                            }\n                        }\n                    }\n                }\n                else {\n                    var values;\n                    if (s.params.removeDiacritics) values = $.removeDiacritics(query.trim().toLowerCase()).split(' ');\n                    else {\n                        values = query.trim().toLowerCase().split(' ');\n                    }\n                    s.searchList.find('li').removeClass('hidden-by-searchbar').each(function (index, el) {\n                        el = $(el);\n                        var compareWithText = [];\n                        el.find(s.params.searchIn).each(function () {\n                            var itemText = $(this).text().trim().toLowerCase();\n                            if (s.params.removeDiacritics) itemText = $.removeDiacritics(itemText);\n                            compareWithText.push(itemText);\n                        });\n                        compareWithText = compareWithText.join(' ');\n                        var wordsMatch = 0;\n                        for (var i = 0; i < values.length; i++) {\n                            if (compareWithText.indexOf(values[i]) >= 0) wordsMatch++;\n                        }\n                        if (wordsMatch !== values.length && !(s.params.ignore && el.is(s.params.ignore))) {\n                            el.addClass('hidden-by-searchbar');\n                        }\n                        else {\n                            foundItems.push(el[0]);\n                        }\n                    });\n        \n                    if (s.params.hideDividers) {\n                        s.searchList.find('.item-divider, .list-group-title').each(function () {\n                            var title = $(this);\n                            var nextElements = title.nextAll('li');\n                            var hide = true;\n                            for (var i = 0; i < nextElements.length; i++) {\n                                var nextEl = $(nextElements[i]);\n                                if (nextEl.hasClass('list-group-title') || nextEl.hasClass('item-divider')) break;\n                                if (!nextEl.hasClass('hidden-by-searchbar')) {\n                                    hide = false;\n                                }\n                            }\n                            var ignore = s.params.ignore && title.is(s.params.ignore);\n                            if (hide && !ignore) title.addClass('hidden-by-searchbar');\n                            else title.removeClass('hidden-by-searchbar');\n                        });\n                    }\n                    if (s.params.hideGroups) {\n                        s.searchList.find('.list-group').each(function () {\n                            var group = $(this);\n                            var ignore = s.params.ignore && group.is(s.params.ignore);\n                            var notHidden = group.find('li:not(.hidden-by-searchbar)');\n                            if (notHidden.length === 0 && !ignore) {\n                                group.addClass('hidden-by-searchbar');\n                            }\n                            else {\n                                group.removeClass('hidden-by-searchbar');\n                            }\n                        });\n                    }\n                }\n                s.triggerEvent('search', 'onSearch', {query: query, foundItems: foundItems});\n                if (foundItems.length === 0) {\n                    s.notFound.show();\n                    s.found.hide();\n                }\n                else {\n                    s.notFound.hide();\n                    s.found.show();\n                }\n                if (s.isVirtualList) {\n                    virtualList.filterItems(foundItems);\n                }\n            };\n        \n            // Events\n            function preventSubmit(e) {\n                e.preventDefault();\n            }\n        \n            s.attachEvents = function (destroy) {\n                var method = destroy ? 'off' : 'on';\n                s.container[method]('submit', preventSubmit);\n                if (!s.material) s.cancelButton[method]('click', s.disable);\n                s.overlay[method]('click', s.disable);\n                s.input[method]('focus', s.enable);\n                s.input[method]('change keydown keypress keyup', s.handleInput);\n                s.clearButton[method]('click', s.clear);\n                    \n            };\n            s.detachEvents = function() {\n                s.attachEvents(true);\n            };\n        \n            // Init Destroy\n            s.init = function () {\n                s.attachEvents();\n            };\n            s.destroy = function () {\n                if (!s) return;\n                s.detachEvents();\n                s = null;\n            };\n        \n            // Init\n            s.init();\n        \n            s.container[0].f7Searchbar = s;\n            return s;\n        \n        };\n        app.searchbar = function (container, params) {\n            return new Searchbar(container, params);\n        };\n        app.initSearchbar = function (container) {\n            container = $(container);\n            var searchbar = container.hasClass('searchbar') ? container : container.find('.searchbar');\n            if (searchbar.length === 0) return;\n            if (!searchbar.hasClass('searchbar-init')) return;\n        \n            var sb = app.searchbar(searchbar, searchbar.dataset());\n        \n            function onBeforeRemove() {\n                if (sb) sb.destroy();\n            }\n            if (container.hasClass('page')) {\n                container.once('pageBeforeRemove', onBeforeRemove);   \n            }\n            else if (container.hasClass('navbar-inner')) {\n                container.once('navbarBeforeRemove', onBeforeRemove);\n            }\n        };\n\n        /*======================================================\n        ************   Messagebar   ************\n        ======================================================*/\n        var Messagebar = function (container, params) {\n            var defaults = {\n                textarea: null,\n                maxHeight: null,\n            };\n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined' || params[def] === null) {\n                    params[def] = defaults[def];\n                }\n            }\n            \n            // Instance\n            var m = this;\n        \n            // Params\n            m.params = params;\n        \n            // Container\n            m.container = $(container);\n            if (m.container.length === 0) return;\n        \n            // Textarea\n            m.textarea = m.params.textarea ? $(m.params.textarea) : m.container.find('textarea');\n        \n            // Is In Page\n            m.pageContainer = m.container.parents('.page').eq(0);\n            m.pageContent = m.pageContainer.find('.page-content');\n        \n            // Initial Sizes\n            m.pageContentPadding = parseInt(m.pageContent.css('padding-bottom'));\n            m.initialBarHeight = m.container[0].offsetHeight;\n            m.initialAreaHeight = m.textarea[0].offsetHeight;\n            \n        \n            // Resize textarea\n            m.sizeTextarea = function () {\n                // Reset\n                m.textarea.css({'height': ''});\n                \n                var height = m.textarea[0].offsetHeight;\n                var diff = height - m.textarea[0].clientHeight;\n                var scrollHeight = m.textarea[0].scrollHeight;\n        \n                // Update\n                if (scrollHeight + diff > height) {\n                    var newAreaHeight = scrollHeight + diff;\n                    var newBarHeight = m.initialBarHeight + (newAreaHeight - m.initialAreaHeight);\n                    var maxBarHeight = m.params.maxHeight || m.container.parents('.view')[0].offsetHeight - 88;\n                    if (newBarHeight > maxBarHeight) {\n                        newBarHeight = parseInt(maxBarHeight, 10);\n                        newAreaHeight = newBarHeight - m.initialBarHeight + m.initialAreaHeight;\n                    }\n                    m.textarea.css('height', newAreaHeight + 'px');\n                    m.container.css('height', newBarHeight + 'px');\n                    var onBottom = (m.pageContent[0].scrollTop === m.pageContent[0].scrollHeight - m.pageContent[0].offsetHeight);\n                    if (m.pageContent.length > 0) {\n                        m.pageContent.css('padding-bottom', newBarHeight + 'px');\n                        if (m.pageContent.find('.messages-new-first').length === 0 && onBottom) {\n                            m.pageContent.scrollTop(m.pageContent[0].scrollHeight - m.pageContent[0].offsetHeight);\n                        }\n                    }\n                }\n                else {\n                    if (m.pageContent.length > 0) {\n                        m.container.css({'height': '', 'bottom': ''});\n                        m.pageContent.css({'padding-bottom': ''});\n                    }\n                }\n            };\n            \n            // Clear\n            m.clear = function () {\n                m.textarea.val('').trigger('change');\n            };\n            m.value = function (value) {\n                if (typeof value === 'undefined') return m.textarea.val();\n                else m.textarea.val(value).trigger('change');  \n            };\n            \n            // Handle textarea\n            m.textareaTimeout = undefined;\n            m.handleTextarea = function (e) {\n                clearTimeout(m.textareaTimeout);\n                m.textareaTimeout = setTimeout(function () {\n                    m.sizeTextarea();\n                }, 0);\n            };\n        \n            //Events\n            function preventSubmit(e) {\n                e.preventDefault();\n            }\n        \n            m.attachEvents = function (destroy) {\n                var method = destroy ? 'off' : 'on';\n                m.container[method]('submit', preventSubmit);\n                m.textarea[method]('change keydown keypress keyup paste cut', m.handleTextarea);\n            };\n            m.detachEvents = function () {\n                m.attachEvents(true);\n            };\n            \n            // Init Destroy\n            m.init = function () {\n                m.attachEvents();\n            };\n            m.destroy = function () {\n                m.detachEvents();\n                m = null;\n            };\n        \n            // Init\n            m.init();\n        \n            m.container[0].f7Messagebar = m;\n            return m;\n        };\n        app.messagebar = function (container, params) {\n            return new Messagebar(container, params);\n        };\n        app.initPageMessagebar = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var messagebar = pageContainer.hasClass('messagebar') ? pageContainer : pageContainer.find('.messagebar');\n            if (messagebar.length === 0) return;\n            if (!messagebar.hasClass('messagebar-init')) return;\n            var mb = app.messagebar(messagebar, messagebar.dataset());\n        \n            // Destroy on page remove\n            function pageBeforeRemove() {\n                mb.destroy();\n                pageContainer.off('pageBeforeRemove', pageBeforeRemove);\n            }\n            if (pageContainer.hasClass('page')) {\n                pageContainer.on('pageBeforeRemove', pageBeforeRemove);\n            }\n        };\n\n        /*======================================================\n        ************   XHR   ************\n        ======================================================*/\n        // XHR Caching\n        app.cache = [];\n        app.removeFromCache = function (url) {\n            var index = false;\n            for (var i = 0; i < app.cache.length; i++) {\n                if (app.cache[i].url === url) index = i;\n            }\n            if (index !== false) app.cache.splice(index, 1);\n        };\n        \n        // XHR\n        app.xhr = false;\n        app.get = function (url, view, ignoreCache, callback) {\n            // should we ignore get params or not\n            var _url = url;\n            if (app.params.cacheIgnoreGetParameters && url.indexOf('?') >= 0) {\n                _url = url.split('?')[0];\n            }\n            if (app.params.cache && !ignoreCache && url.indexOf('nocache') < 0 && app.params.cacheIgnore.indexOf(_url) < 0) {\n                // Check is the url cached\n                for (var i = 0; i < app.cache.length; i++) {\n                    if (app.cache[i].url === _url) {\n                        // Check expiration\n                        if ((new Date()).getTime() - app.cache[i].time < app.params.cacheDuration) {\n                            // Load from cache\n                            callback(app.cache[i].content);\n                            return false;\n                        }\n                    }\n                }\n            }\n        \n            app.xhr = $.ajax({\n                url: url,\n                method: 'GET',\n                beforeSend: app.params.onAjaxStart,\n                complete: function (xhr) {\n                    if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {\n                        if (app.params.cache) {\n                            app.removeFromCache(_url);\n                            app.cache.push({\n                                url: _url,\n                                time: (new Date()).getTime(),\n                                content: xhr.responseText\n                            });\n                        }\n                        callback(xhr.responseText, false);\n                    }\n                    else {\n                        callback(xhr.responseText, true);\n                    }\n                    if (app.params.onAjaxComplete) app.params.onAjaxComplete(xhr);\n                },\n                error: function (xhr) {\n                    callback(xhr.responseText, true);\n                    if (app.params.onAjaxError) app.params.onAjaxError(xhr);\n                }\n            });\n            if (view) view.xhr = app.xhr;\n        \n            return app.xhr;\n        };\n        \n\n        /*======================================================\n        ************   Pages   ************\n        ======================================================*/\n        // Page Callbacks API\n        app.pageCallbacks = {};\n        \n        app.onPage = function (callbackName, pageName, callback) {\n            if (pageName && pageName.split(' ').length > 1) {\n                var pageNames = pageName.split(' ');\n                var returnCallbacks = [];\n                for (var i = 0; i < pageNames.length; i++) {\n                    returnCallbacks.push(app.onPage(callbackName, pageNames[i], callback));\n                }\n                returnCallbacks.remove = function () {\n                    for (var i = 0; i < returnCallbacks.length; i++) {\n                        returnCallbacks[i].remove();\n                    }\n                };\n                returnCallbacks.trigger = function () {\n                    for (var i = 0; i < returnCallbacks.length; i++) {\n                        returnCallbacks[i].trigger();\n                    }\n                };\n                return returnCallbacks;\n            }\n            var callbacks = app.pageCallbacks[callbackName][pageName];\n            if (!callbacks) {\n                callbacks = app.pageCallbacks[callbackName][pageName] = [];\n            }\n            app.pageCallbacks[callbackName][pageName].push(callback);\n            return {\n                remove: function () {\n                    var removeIndex;\n                    for (var i = 0; i < callbacks.length; i++) {\n                        if (callbacks[i].toString() === callback.toString()) {\n                            removeIndex = i;\n                        }\n                    }\n                    if (typeof removeIndex !== 'undefined') callbacks.splice(removeIndex, 1);\n                },\n                trigger: callback\n            };\n        };\n        \n        //Create callbacks methods dynamically\n        function createPageCallback(callbackName) {\n            var capitalized = callbackName.replace(/^./, function (match) {\n                return match.toUpperCase();\n            });\n            app['onPage' + capitalized] = function (pageName, callback) {\n                return app.onPage(callbackName, pageName, callback);\n            };\n        }\n        \n        var pageCallbacksNames = ('beforeInit init reinit beforeAnimation afterAnimation back afterBack beforeRemove').split(' ');\n        for (var i = 0; i < pageCallbacksNames.length; i++) {\n            app.pageCallbacks[pageCallbacksNames[i]] = {};\n            createPageCallback(pageCallbacksNames[i]);\n        }\n        \n        app.triggerPageCallbacks = function (callbackName, pageName, pageData) {\n            var allPagesCallbacks = app.pageCallbacks[callbackName]['*'];\n            if (allPagesCallbacks) {\n                for (var j = 0; j < allPagesCallbacks.length; j++) {\n                    allPagesCallbacks[j](pageData);\n                }\n            }\n            var callbacks = app.pageCallbacks[callbackName][pageName];\n            if (!callbacks || callbacks.length === 0) return;\n            for (var i = 0; i < callbacks.length; i++) {\n                callbacks[i](pageData);\n            }\n        };\n        \n        // On Page Init Callback\n        app.pageInitCallback = function (view, params) {\n            var pageContainer = params.pageContainer;\n            if (!pageContainer) return;\n            if (pageContainer.f7PageInitialized && view && !view.params.domCache) return;\n        \n            var pageQuery = params.query;\n            if (!pageQuery) {\n                if (params.url && params.url.indexOf('?') > 0) {\n                    pageQuery = $.parseUrlQuery(params.url || '');\n                }\n                else if (pageContainer.f7PageData && pageContainer.f7PageData.query) {\n                    pageQuery = pageContainer.f7PageData.query;\n                }\n                else {\n                    pageQuery = {};\n                }\n            }\n        \n            // Page Data\n            var pageData = {\n                container: pageContainer,\n                url: params.url,\n                query: pageQuery,\n                name: $(pageContainer).attr('data-page'),\n                view: view,\n                from: params.position,\n                context: params.context,\n                navbarInnerContainer: params.navbarInnerContainer,\n                fromPage: params.fromPage\n            };\n            if (params.fromPage && !params.fromPage.navbarInnerContainer && params.oldNavbarInnerContainer) {\n                params.fromPage.navbarInnerContainer = params.oldNavbarInnerContainer;\n            }\n        \n            if (pageContainer.f7PageInitialized && ((view && view.params.domCache) || (!view && $(pageContainer).parents('.popup, .popover, .login-screen, .modal, .actions-modal, .picker-modal').length > 0))) {\n                // Reinit Page\n                app.reinitPage(pageContainer);\n        \n                // Callbacks\n                app.pluginHook('pageReinit', pageData);\n                if (app.params.onPageReinit) app.params.onPageReinit(app, pageData);\n                app.triggerPageCallbacks('reinit', pageData.name, pageData);\n                $(pageData.container).trigger('pageReinit', {page: pageData});\n                return;\n            }\n            pageContainer.f7PageInitialized = true;\n        \n            // Store pagedata in page\n            pageContainer.f7PageData = pageData;\n        \n            // Update View's activePage\n            if (view && !params.preloadOnly && !params.reloadPrevious) {\n                // Add data-page on view\n                $(view.container).attr('data-page', pageData.name);\n                // Update View active page data\n                view.activePage = pageData;\n            }\n        \n            // Before Init Callbacks\n            app.pluginHook('pageBeforeInit', pageData);\n            if (app.params.onPageBeforeInit) app.params.onPageBeforeInit(app, pageData);\n            app.triggerPageCallbacks('beforeInit', pageData.name, pageData);\n            $(pageData.container).trigger('pageBeforeInit', {page: pageData});\n        \n            // Init page\n            app.initPage(pageContainer);\n        \n            // Init Callback\n            app.pluginHook('pageInit', pageData);\n            if (app.params.onPageInit) app.params.onPageInit(app, pageData);\n            app.triggerPageCallbacks('init', pageData.name, pageData);\n            $(pageData.container).trigger('pageInit', {page: pageData});\n        };\n        app.pageRemoveCallback = function (view, pageContainer, position) {\n            var pageContext;\n            if (!pageContainer) return;\n            if (pageContainer.f7PageData) pageContext = pageContainer.f7PageData.context;\n            // Page Data\n            var pageData = {\n                container: pageContainer,\n                name: $(pageContainer).attr('data-page'),\n                view: view,\n                url: pageContainer.f7PageData && pageContainer.f7PageData.url,\n                query: pageContainer.f7PageData && pageContainer.f7PageData.query,\n                navbarInnerContainer: pageContainer.f7PageData && pageContainer.f7PageData.navbarInnerContainer,\n                from: position,\n                context: pageContext\n            };\n            // Before Init Callback\n            app.pluginHook('pageBeforeRemove', pageData);\n            if (app.params.onPageBeforeRemove) app.params.onPageBeforeRemove(app, pageData);\n            app.triggerPageCallbacks('beforeRemove', pageData.name, pageData);\n            $(pageData.container).trigger('pageBeforeRemove', {page: pageData});\n            pageData = null;\n        };\n        app.pageBackCallback = function (callback, view, params) {\n            // Page Data\n            var pageContainer = params.pageContainer;\n            var pageContext;\n            if (!pageContainer) return;\n            if (pageContainer.f7PageData) pageContext = pageContainer.f7PageData.context;\n        \n            var pageData = {\n                container: pageContainer,\n                name: $(pageContainer).attr('data-page'),\n                url: pageContainer.f7PageData && pageContainer.f7PageData.url,\n                query: pageContainer.f7PageData && pageContainer.f7PageData.query,\n                view: view,\n                from: params.position,\n                context: pageContext,\n                navbarInnerContainer: pageContainer.f7PageData && pageContainer.f7PageData.navbarInnerContainer,\n                swipeBack: params.swipeBack\n            };\n        \n            if (callback === 'after') {\n                app.pluginHook('pageAfterBack', pageData);\n                if (app.params.onPageAfterBack) app.params.onPageAfterBack(app, pageData);\n                app.triggerPageCallbacks('afterBack', pageData.name, pageData);\n                $(pageContainer).trigger('pageAfterBack', {page: pageData});\n        \n            }\n            if (callback === 'before') {\n                app.pluginHook('pageBack', pageData);\n                if (app.params.onPageBack) app.params.onPageBack(app, pageData);\n                app.triggerPageCallbacks('back', pageData.name, pageData);\n                $(pageData.container).trigger('pageBack', {page: pageData});\n            }\n        };\n        app.pageAnimCallback = function (callback, view, params) {\n            var pageContainer = params.pageContainer;\n            var pageContext;\n            if (!pageContainer) return;\n            if (pageContainer.f7PageData) pageContext = pageContainer.f7PageData.context;\n        \n            var pageQuery = params.query;\n            if (!pageQuery) {\n                if (params.url && params.url.indexOf('?') > 0) {\n                    pageQuery = $.parseUrlQuery(params.url || '');\n                }\n                else if (pageContainer.f7PageData && pageContainer.f7PageData.query) {\n                    pageQuery = pageContainer.f7PageData.query;\n                }\n                else {\n                    pageQuery = {};\n                }\n            }\n            // Page Data\n            var pageData = {\n                container: pageContainer,\n                url: params.url,\n                query: pageQuery,\n                name: $(pageContainer).attr('data-page'),\n                view: view,\n                from: params.position,\n                context: pageContext,\n                swipeBack: params.swipeBack,\n                navbarInnerContainer: pageContainer.f7PageData && pageContainer.f7PageData.navbarInnerContainer,\n                fromPage: params.fromPage\n            };\n            var oldPage = params.oldPage,\n                newPage = params.newPage;\n        \n            // Update page date\n            pageContainer.f7PageData = pageData;\n        \n            if (callback === 'after') {\n                app.pluginHook('pageAfterAnimation', pageData);\n                if (app.params.onPageAfterAnimation) app.params.onPageAfterAnimation(app, pageData);\n                app.triggerPageCallbacks('afterAnimation', pageData.name, pageData);\n                $(pageData.container).trigger('pageAfterAnimation', {page: pageData});\n        \n            }\n            if (callback === 'before') {\n                // Add data-page on view\n                $(view.container).attr('data-page', pageData.name);\n        \n                // Update View's activePage\n                if (view) view.activePage = pageData;\n        \n                // Hide/show navbar dynamically\n                if (newPage.hasClass('no-navbar') && !oldPage.hasClass('no-navbar')) {\n                    view.hideNavbar();\n                }\n                if (!newPage.hasClass('no-navbar') && (oldPage.hasClass('no-navbar') || oldPage.hasClass('no-navbar-by-scroll'))) {\n                    view.showNavbar();\n                }\n                // Hide/show navbar toolbar\n                if (newPage.hasClass('no-toolbar') && !oldPage.hasClass('no-toolbar')) {\n                    view.hideToolbar();\n                }\n                if (!newPage.hasClass('no-toolbar') && (oldPage.hasClass('no-toolbar') || oldPage.hasClass('no-toolbar-by-scroll'))) {\n                    view.showToolbar();\n                }\n                // Hide/show tabbar\n                var tabBar;\n                if (newPage.hasClass('no-tabbar') && !oldPage.hasClass('no-tabbar')) {\n                    tabBar = $(view.container).find('.tabbar');\n                    if (tabBar.length === 0) tabBar = $(view.container).parents('.' + app.params.viewsClass).find('.tabbar');\n                    app.hideToolbar(tabBar);\n                }\n                if (!newPage.hasClass('no-tabbar') && (oldPage.hasClass('no-tabbar') || oldPage.hasClass('no-tabbar-by-scroll'))) {\n                    tabBar = $(view.container).find('.tabbar');\n                    if (tabBar.length === 0) tabBar = $(view.container).parents('.' + app.params.viewsClass).find('.tabbar');\n                    app.showToolbar(tabBar);\n                }\n        \n                oldPage.removeClass('no-navbar-by-scroll no-toolbar-by-scroll');\n                // Callbacks\n                app.pluginHook('pageBeforeAnimation', pageData);\n                if (app.params.onPageBeforeAnimation) app.params.onPageBeforeAnimation(app, pageData);\n                app.triggerPageCallbacks('beforeAnimation', pageData.name, pageData);\n                $(pageData.container).trigger('pageBeforeAnimation', {page: pageData});\n            }\n        };\n        \n        // Init Page Events and Manipulations\n        app.initPage = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            if (pageContainer.length === 0) return;\n            // Size navbars on page load\n            if (app.sizeNavbars) app.sizeNavbars(pageContainer.parents('.' + app.params.viewClass)[0]);\n            // Init messages\n            if (app.initPageMessages) app.initPageMessages(pageContainer);\n            // Init forms storage\n            if (app.initFormsStorage) app.initFormsStorage(pageContainer);\n            // Init smart select\n            if (app.initSmartSelects) app.initSmartSelects(pageContainer);\n            // Init slider\n            if (app.initPageSwiper) app.initPageSwiper(pageContainer);\n            // Init pull to refres\n            if (app.initPullToRefresh) app.initPullToRefresh(pageContainer);\n            // Init infinite scroll\n            if (app.initPageInfiniteScroll) app.initPageInfiniteScroll(pageContainer);\n            // Init searchbar\n            if (app.initSearchbar) app.initSearchbar(pageContainer);\n            // Init message bar\n            if (app.initPageMessagebar) app.initPageMessagebar(pageContainer);\n            // Init scroll toolbars\n            if (app.initPageScrollToolbars) app.initPageScrollToolbars(pageContainer);\n            // Init lazy images\n            if (app.initImagesLazyLoad) app.initImagesLazyLoad(pageContainer);\n            // Init progress bars\n            if (app.initPageProgressbar) app.initPageProgressbar(pageContainer);\n            // Init resizeable textareas\n            if (app.initPageResizableTextarea) app.initPageResizableTextarea(pageContainer);\n            // Init Material Preloader\n            if (app.params.material && app.initPageMaterialPreloader) app.initPageMaterialPreloader(pageContainer);\n            // Init Material Inputs\n            if (app.params.material && app.initPageMaterialInputs) app.initPageMaterialInputs(pageContainer);\n            // Init Material Tabbar\n            if (app.params.material && app.initPageMaterialTabbar) app.initPageMaterialTabbar(pageContainer);\n        };\n        app.reinitPage = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            if (pageContainer.length === 0) return;\n            // Size navbars on page reinit\n            if (app.sizeNavbars) app.sizeNavbars(pageContainer.parents('.' + app.params.viewClass)[0]);\n            // Reinit slider\n            if (app.reinitPageSwiper) app.reinitPageSwiper(pageContainer);\n            // Reinit lazy load\n            if (app.reinitLazyLoad) app.reinitLazyLoad(pageContainer);\n        };\n        app.initPageWithCallback = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var viewContainer = pageContainer.parents('.' + app.params.viewClass);\n            if (viewContainer.length === 0) return;\n            var view = viewContainer[0].f7View || undefined;\n            var url = view && view.url ? view.url : undefined;\n            if (viewContainer && pageContainer.attr('data-page')) {\n                viewContainer.attr('data-page', pageContainer.attr('data-page'));\n            }\n            app.pageInitCallback(view, {pageContainer: pageContainer[0], url: url, position: 'center'});\n        };\n\n        /*======================================================\n        ************   Navigation / Router   ************\n        ======================================================*/\n        app.router = {\n            _remove: function (el) {\n                if (app.params.routerRemoveTimeout || app.params.routerRemoveWithTimeout) {\n                    setTimeout(function () {\n                        $(el).remove();\n                    }, 0);\n                }\n                else $(el).remove();\n            },\n            // Temporary DOM Element\n            temporaryDom: document.createElement('div'),\n        \n            // Find page or navbar in passed container which are related to View\n            findElement: function (selector, container, view, notCached) {\n                container = $(container);\n                if (notCached) selector = selector + ':not(.cached)';\n                var found = container.find(selector);\n                if (found.length > 1) {\n                    if (typeof view.selector === 'string') {\n                        // Search in related view\n                        found = container.find(view.selector + ' ' + selector);\n                    }\n                    if (found.length > 1) {\n                        // Search in main view\n                        found = container.find('.' + app.params.viewMainClass + ' ' + selector);\n                    }\n                }\n                if (found.length === 1) return found;\n                else {\n                    // Try to find non cached\n                    if (!notCached) found = app.router.findElement(selector, container, view, true);\n                    if (found && found.length === 1) return found;\n                    if (found && found.length > 1) return $(found[0]);\n                    else return undefined;\n                }\n            },\n        \n            // Set pages classess for animationEnd\n            animatePages: function (leftPage, rightPage, direction, view) {\n                // Loading new page\n                var removeClasses = 'page-on-center page-on-right page-on-left';\n                if (direction === 'to-left') {\n                    leftPage.removeClass(removeClasses).addClass('page-from-center-to-left');\n                    rightPage.removeClass(removeClasses).addClass('page-from-right-to-center');\n                }\n                // Go back\n                if (direction === 'to-right') {\n                    leftPage.removeClass(removeClasses).addClass('page-from-left-to-center');\n                    rightPage.removeClass(removeClasses).addClass('page-from-center-to-right');\n        \n                }\n            },\n        \n            // Prepare navbar before animarion\n            prepareNavbar: function (newNavbarInner, oldNavbarInner, newNavbarPosition) {\n                $(newNavbarInner).find('.sliding').each(function () {\n                    var sliding = $(this);\n                    var slidingOffset = newNavbarPosition === 'right' ? this.f7NavbarRightOffset : this.f7NavbarLeftOffset;\n        \n                    if (app.params.animateNavBackIcon) {\n                        if (sliding.hasClass('left') && sliding.find('.back .icon').length > 0) {\n                            sliding.find('.back .icon').transform('translate3d(' + (-slidingOffset) + 'px,0,0)');\n                        }\n                    }\n                    sliding.transform('translate3d(' + slidingOffset + 'px,0,0)');\n                });\n            },\n        \n            // Set navbars classess for animation\n            animateNavbars: function (leftNavbarInner, rightNavbarInner, direction, view) {\n                // Loading new page\n                var removeClasses = 'navbar-on-right navbar-on-center navbar-on-left';\n                if (direction === 'to-left') {\n                    rightNavbarInner.removeClass(removeClasses).addClass('navbar-from-right-to-center');\n                    rightNavbarInner.find('.sliding').each(function () {\n                        var sliding = $(this);\n                        sliding.transform('translate3d(0px,0,0)');\n                        if (app.params.animateNavBackIcon) {\n                            if (sliding.hasClass('left') && sliding.find('.back .icon').length > 0) {\n                                sliding.find('.back .icon').transform('translate3d(0px,0,0)');\n                            }\n                        }\n                    });\n        \n                    leftNavbarInner.removeClass(removeClasses).addClass('navbar-from-center-to-left');\n                    leftNavbarInner.find('.sliding').each(function () {\n                        var sliding = $(this);\n                        var rightText;\n                        if (app.params.animateNavBackIcon) {\n                            if (sliding.hasClass('center') && rightNavbarInner.find('.sliding.left .back .icon').length > 0) {\n                                rightText = rightNavbarInner.find('.sliding.left .back span');\n                                if (rightText.length > 0) this.f7NavbarLeftOffset += rightText[0].offsetLeft;\n                            }\n                            if (sliding.hasClass('left') && sliding.find('.back .icon').length > 0) {\n                                sliding.find('.back .icon').transform('translate3d(' + (-this.f7NavbarLeftOffset) + 'px,0,0)');\n                            }\n                        }\n                        sliding.transform('translate3d(' + (this.f7NavbarLeftOffset) + 'px,0,0)');\n                    });\n                }\n                // Go back\n                if (direction === 'to-right') {\n                    leftNavbarInner.removeClass(removeClasses).addClass('navbar-from-left-to-center');\n                    leftNavbarInner.find('.sliding').each(function () {\n                        var sliding = $(this);\n                        sliding.transform('translate3d(0px,0,0)');\n                        if (app.params.animateNavBackIcon) {\n                            if (sliding.hasClass('left') && sliding.find('.back .icon').length > 0) {\n                                sliding.find('.back .icon').transform('translate3d(0px,0,0)');\n                            }\n                        }\n                    });\n        \n                    rightNavbarInner.removeClass(removeClasses).addClass('navbar-from-center-to-right');\n                    rightNavbarInner.find('.sliding').each(function () {\n                        var sliding = $(this);\n                        if (app.params.animateNavBackIcon) {\n                            if (sliding.hasClass('left') && sliding.find('.back .icon').length > 0) {\n                                sliding.find('.back .icon').transform('translate3d(' + (-this.f7NavbarRightOffset) + 'px,0,0)');\n                            }\n                        }\n                        sliding.transform('translate3d(' + (this.f7NavbarRightOffset) + 'px,0,0)');\n                    });\n                }\n            },\n        \n            preprocess: function(view, content, url, next) {\n                // Plugin hook\n                app.pluginHook('routerPreprocess', view, content, url, next);\n        \n                // Preprocess by plugin\n                content = app.pluginProcess('preprocess', content);\n        \n                if (view && view.params && view.params.preprocess) {\n                    content = view.params.preprocess(content, url, next);\n                    if (typeof content !== 'undefined') {\n                        next(content);\n                    }\n                }\n                else if (app.params.preprocess) {\n                    content = app.params.preprocess(content, url, next);\n                    if (typeof content !== 'undefined') {\n                        next(content);\n                    }\n                }\n                else {\n                    next(content);\n                }\n            },\n            preroute: function(view, options, isBack) {\n                if (isBack) options.isBack = true;\n                app.pluginHook('routerPreroute', view, options);\n                if ((app.params.preroute && app.params.preroute(view, options) === false) || (view && view.params.preroute && view.params.preroute(view, options) === false)) {\n                    return true;\n                }\n                else {\n                    return false;\n                }\n            },\n        \n            template7Render: function (view, options) {\n                var url = options.url,\n                    content = options.content, //initial content\n                    t7_rendered_content = options.content, // will be rendered using Template7\n                    context = options.context, // Context data for Template7\n                    contextName = options.contextName,\n                    template = options.template, // Template 7 compiled template\n                    pageName = options.pageName;\n        \n                var t7_ctx, t7_template;\n                if (typeof content === 'string') {\n                    if (url) {\n                        if (app.template7Cache[url] && !options.ignoreCache) t7_template = t7.cache[url];\n                        else {\n                            t7_template = t7.compile(content);\n                            t7.cache[url] = t7_template;\n                        }\n                    }\n                    else t7_template = t7.compile(content);\n                }\n                else if (template) {\n                    t7_template = template;\n                }\n        \n                if (context) {\n                    t7_ctx = context;\n                    if (context && url) {\n                        view.contextCache[url] = context;\n                    }\n                }\n                else {\n                    if (contextName) {\n                        if (contextName.indexOf('.') >= 0) {\n                            var _ctx_path = contextName.split('.');\n                            var _ctx = t7.data[_ctx_path[0]];\n                            for (var i = 1; i < _ctx_path.length; i++) {\n                                if (_ctx_path[i]) _ctx = _ctx[_ctx_path[i]];\n                            }\n                            t7_ctx = _ctx;\n                        }\n                        else t7_ctx = t7.data[contextName];\n                    }\n                    if (!t7_ctx && url) {\n                        t7_ctx = t7.data['url:' + url];\n                    }\n                    if (!t7_ctx && typeof content === 'string' && !template) {\n                        //try to find by page name in content\n                        var pageNameMatch = content.match(/(data-page=[\"'][^\"^']*[\"'])/);\n                        if (pageNameMatch) {\n                            var page = pageNameMatch[0].split('data-page=')[1].replace(/['\"]/g, '');\n                            if (page) t7_ctx = t7.data['page:' + page];\n                        }\n                    }\n                    if (!t7_ctx && template && t7.templates) {\n                        // Try to find matched template name in t7.templates\n                        for (var templateName in t7.templates) {\n                            if (t7.templates[templateName] === template) t7_ctx = t7.data[templateName];\n                        }\n                    }\n                    if (!t7_ctx && url && url in view.contextCache) {\n                        t7_ctx = view.contextCache[url];\n                    }\n                    if (!t7_ctx) {\n                        t7_ctx = {};\n                    }\n                }\n        \n                if (t7_template && t7_ctx) {\n                    if (typeof t7_ctx === 'function') t7_ctx = t7_ctx();\n                    if (url) {\n                        // Extend data with URL query\n                        var query = $.parseUrlQuery(url);\n                        t7_ctx.url_query = {};\n                        for (var key in query) {\n                            t7_ctx.url_query[key] = query[key];\n                        }\n                    }\n                    try {\n                        t7_rendered_content = t7_template(t7_ctx);\n                    }\n                    catch (e) {\n                        t7_rendered_content = '';\n                        if (window.console && window.console.error) {\n                            console.error(e);\n                        }\n                    }\n                }\n        \n                return {content: t7_rendered_content, context: t7_ctx};\n            }\n        };\n        \n        \n        app.router._load = function (view, options) {\n            options = options || {};\n        \n            var url = options.url,\n                content = options.content, //initial content\n                t7_rendered = {content: options.content},\n                template = options.template, // Template 7 compiled template\n                pageName = options.pageName,\n                viewContainer = $(view.container),\n                pagesContainer = $(view.pagesContainer),\n                animatePages = options.animatePages,\n                newPage, oldPage, pagesInView, i, oldNavbarInner, newNavbarInner, navbar, dynamicNavbar, reloadPosition,\n                isDynamicPage = typeof url === 'undefined' && content || template,\n                pushState = options.pushState,\n                pageElement = options.pageElement;\n        \n            if (typeof animatePages === 'undefined') animatePages = view.params.animatePages;\n            // Plugin hook\n            app.pluginHook('routerLoad', view, options);\n        \n            // Render with Template7\n            if (app.params.template7Pages && typeof content === 'string' || template) {\n                t7_rendered = app.router.template7Render(view, options);\n                if (t7_rendered.content && !content) {\n                    content = t7_rendered.content;\n                }\n            }\n        \n            app.router.temporaryDom.innerHTML = '';\n        \n            // Parse DOM\n            if (!pageName && !pageElement) {\n                if ((typeof content === 'string') || (url && (typeof content === 'string'))) {\n                    app.router.temporaryDom.innerHTML = t7_rendered.content;\n                } else {\n                    if ('length' in content && content.length > 1) {\n                        for (var ci = 0; ci < content.length; ci++) {\n                            $(app.router.temporaryDom).append(content[ci]);\n                        }\n                    } else {\n                        $(app.router.temporaryDom).append(content);\n                    }\n                }\n            }\n        \n            // Reload position\n            reloadPosition = options.reload && (options.reloadPrevious ? 'left' : 'center');\n        \n            // Find new page\n            if (pageName) newPage = pagesContainer.find('.page[data-page=\"' + pageName + '\"]');\n            else {\n                if (pageElement) newPage = $(pageElement);\n                else newPage = app.router.findElement('.page', app.router.temporaryDom, view);\n            }\n        \n            // If page not found exit\n            if (!newPage || newPage.length === 0 || (pageName && view.activePage && view.activePage.name === pageName)) {\n                view.allowPageChange = true;\n                return;\n            }\n        \n            newPage.addClass(options.reload ? 'page-on-' + reloadPosition : 'page-on-right');\n        \n            // Find old page (should be the last one) and remove older pages\n            pagesInView = pagesContainer.children('.page:not(.cached)');\n            if (pageElement) {\n                pagesInView = pagesInView.filter(function (index, page) {\n                    if (page !== pageElement) return page;\n                });\n            }\n        \n            if (options.reload && options.reloadPrevious && pagesInView.length === 1)  {\n                view.allowPageChange = true;\n                return;\n            }\n        \n            if (options.reload) {\n                oldPage = pagesInView.eq(pagesInView.length - 1);\n            }\n            else {\n                if (pagesInView.length > 1) {\n                    for (i = 0; i < pagesInView.length - 2; i++) {\n                        if (!view.params.domCache) {\n                            app.pageRemoveCallback(view, pagesInView[i], 'left');\n                            app.router._remove(pagesInView[i]);\n                        }\n                        else {\n                            $(pagesInView[i]).addClass('cached');\n                        }\n                    }\n                    if (!view.params.domCache) {\n                        app.pageRemoveCallback(view, pagesInView[i], 'left');\n                        app.router._remove(pagesInView[i]);\n                    }\n                    else {\n                        $(pagesInView[i]).addClass('cached');\n                    }\n                }\n                oldPage = pagesContainer.children('.page:not(.cached)');\n            }\n            if (pageElement && oldPage.length > 1) {\n                oldPage = oldPage.filter(function (index, page) {\n                    if (page !== pageElement) return page;\n                });\n            }\n            if(view.params.domCache || pageElement) newPage.removeClass('cached');\n        \n            // Dynamic navbar\n            if (view.params.dynamicNavbar) {\n                dynamicNavbar = true;\n                // Find navbar\n                if (pageName) {\n                    newNavbarInner = viewContainer.find('.navbar-inner[data-page=\"' + pageName + '\"]');\n                }\n                else {\n                    newNavbarInner = app.router.findElement('.navbar-inner', app.router.temporaryDom, view);\n                }\n                if (!newNavbarInner || newNavbarInner.length === 0) {\n                    // Look in page\n                    newNavbarInner = newPage.find('.navbar-inner');\n                    if (!newNavbarInner || newNavbarInner.length === 0) {\n                        // Set false\n                        dynamicNavbar = false;\n                    }\n                    else {\n                        if (newNavbarInner.parent('.navbar').length > 0) {\n                            newNavbarInner.prependTo(newPage);\n                        }\n                    }\n                }\n                if (dynamicNavbar && newPage.find('.navbar').length > 0) {\n                    app.router._remove(newPage.find('.navbar'));\n                }\n                navbar = viewContainer.children('.navbar');\n                if (options.reload) {\n                    oldNavbarInner = navbar.find('.navbar-inner:not(.cached):last-child');\n                }\n                else {\n                    oldNavbarInner = navbar.find('.navbar-inner:not(.cached)');\n        \n                    if (oldNavbarInner.length > 0) {\n                        for (i = 0; i < oldNavbarInner.length - 1; i++) {\n                            if (!view.params.domCache) {\n                                app.navbarRemoveCallback(view, pagesInView[i], navbar[0], oldNavbarInner[i]);\n                                app.router._remove(oldNavbarInner[i]);\n                            }\n                            else\n                                $(oldNavbarInner[i]).addClass('cached');\n                        }\n                        if (!newNavbarInner && oldNavbarInner.length === 1) {\n                            if (!view.params.domCache) {\n                                app.navbarRemoveCallback(view, pagesInView[0], navbar[0], oldNavbarInner[0]);\n                                app.router._remove(oldNavbarInner[0]);\n                            }\n                            else\n                                $(oldNavbarInner[0]).addClass('cached');\n                        }\n                        oldNavbarInner = navbar.find('.navbar-inner:not(.cached)');\n                    }\n                }\n            }\n            if (dynamicNavbar) {\n                newNavbarInner.addClass(options.reload ? 'navbar-on-' + reloadPosition : 'navbar-on-right');\n                if(view.params.domCache || pageElement) newNavbarInner.removeClass('cached');\n                newPage[0].f7RelatedNavbar = newNavbarInner[0];\n                newNavbarInner[0].f7RelatedPage = newPage[0];\n            }\n        \n            // save content areas into view's cache\n            if (!url) {\n                var newPageName = pageName || newPage.attr('data-page');\n                if (isDynamicPage) url = '#' + app.params.dynamicPageUrl.replace(/{{name}}/g, newPageName).replace(/{{index}}/g, view.history.length - (options.reload ? 1 : 0));\n                else url = '#' + newPageName;\n                if (!view.params.domCache) {\n                    view.contentCache[url] = content;\n                }\n                if (view.params.domCache && pageName) {\n                    view.pagesCache[url] = pageName;\n                }\n            }\n            else if (url && pageElement) {\n                view.pageElementsCache[url] = {\n                    page: newPage,\n                    navbarInner: newNavbarInner\n                };\n            }\n        \n            // Push State\n            if (app.params.pushState && !options.reloadPrevious && view.main)  {\n                if (typeof pushState === 'undefined') pushState = true;\n                var pushStateRoot = app.params.pushStateRoot || '';\n                var method = options.reload ? 'replaceState' : 'pushState';\n                if (pushState) {\n                    if (!isDynamicPage && !pageName) {\n                        history[method]({url: url, viewIndex: app.views.indexOf(view)}, '', pushStateRoot + app.params.pushStateSeparator + url);\n                    }\n                    else if (isDynamicPage && content) {\n                        history[method]({content: typeof content === 'string' ? content : '', url: url, viewIndex: app.views.indexOf(view)}, '', pushStateRoot + app.params.pushStateSeparator + url);\n                    }\n                    else if (pageName) {\n                        history[method]({pageName: pageName, url: url, viewIndex: app.views.indexOf(view)}, '', pushStateRoot + app.params.pushStateSeparator + url);\n                    }\n                }\n            }\n        \n            // Update View history\n            view.url = url;\n            if (options.reload) {\n                var lastUrl = view.history[view.history.length - (options.reloadPrevious ? 2 : 1)];\n                if (lastUrl &&\n                    lastUrl.indexOf('#') === 0 &&\n                    lastUrl in view.contentCache &&\n                    lastUrl !== url &&\n                    view.history.indexOf(lastUrl) === -1) {\n                    view.contentCache[lastUrl] = null;\n                    delete view.contentCache[lastUrl];\n                }\n                else if (lastUrl &&\n                    lastUrl in view.pageElementsCache &&\n                    lastUrl !== url &&\n                    (view.history.indexOf(lastUrl) === -1 || view.history.indexOf(lastUrl) === view.history.length - 1)) {\n                    view.pageElementsCache[lastUrl] = null;\n                    delete view.pageElementsCache[lastUrl];\n                }\n                if (lastUrl &&\n                    lastUrl in view.contextCache &&\n                    lastUrl !== url &&\n                    (view.history.indexOf(lastUrl) === -1 || view.history.indexOf(lastUrl) === view.history.length - 1)) {\n                    view.contextCache[lastUrl] = null;\n                    delete view.contextCache[lastUrl];\n                }\n                view.history[view.history.length - (options.reloadPrevious ? 2 : 1)] = url;\n            }\n            else {\n                view.history.push(url);\n            }\n        \n            // Unique history\n            var historyBecameUnique = false;\n            if (view.params.uniqueHistory) {\n                var _history = view.history;\n                var _url = url;\n                if (view.params.uniqueHistoryIgnoreGetParameters) {\n                    _history = [];\n                    _url = url.split('?')[0];\n                    for (i = 0; i < view.history.length; i++) {\n                        _history.push(view.history[i].split('?')[0]);\n                    }\n                }\n        \n                if (_history.indexOf(_url) !== _history.lastIndexOf(_url)) {\n                    view.history = view.history.slice(0, _history.indexOf(_url));\n                    view.history.push(url);\n                    historyBecameUnique = true;\n                }\n            }\n            // Dom manipulations\n            if (options.reloadPrevious) {\n                oldPage = oldPage.prev('.page');\n                newPage.insertBefore(oldPage);\n                if (dynamicNavbar) {\n                    oldNavbarInner = oldNavbarInner.prev('.navbar-inner');\n                    newNavbarInner.insertAfter(oldNavbarInner);\n                }\n            }\n            else {\n                pagesContainer.append(newPage[0]);\n                if (dynamicNavbar) navbar.append(newNavbarInner[0]);\n            }\n            // Remove Old Page And Navbar\n            if (options.reload) {\n                if (view.params.domCache && view.initialPages.indexOf(oldPage[0]) >= 0) {\n                    oldPage.addClass('cached');\n                    if (dynamicNavbar) oldNavbarInner.addClass('cached');\n                }\n                else {\n                    app.pageRemoveCallback(view, oldPage[0], reloadPosition);\n                    if (dynamicNavbar) app.navbarRemoveCallback(view, oldPage[0], navbar[0], oldNavbarInner[0]);\n                    app.router._remove(oldPage);\n                    if (dynamicNavbar) app.router._remove(oldNavbarInner);\n                }\n            }\n        \n            // Page Init Events\n            app.pageInitCallback(view, {\n                pageContainer: newPage[0],\n                url: url,\n                position: options.reload ? reloadPosition : 'right',\n                navbarInnerContainer: dynamicNavbar ? newNavbarInner && newNavbarInner[0] : undefined,\n                oldNavbarInnerContainer: dynamicNavbar ? oldNavbarInner && oldNavbarInner[0] : undefined,\n                context: t7_rendered.context,\n                query: options.query,\n                fromPage: oldPage && oldPage.length && oldPage[0].f7PageData,\n                reload: options.reload,\n                reloadPrevious: options.reloadPrevious\n            });\n        \n            // Navbar init event\n            if (dynamicNavbar) {\n                app.navbarInitCallback(view, newPage[0], navbar[0], newNavbarInner[0], url, options.reload ? reloadPosition : 'right');\n            }\n        \n            if (options.reload) {\n                view.allowPageChange = true;\n                if (historyBecameUnique) view.refreshPreviousPage();\n                return;\n            }\n        \n            if (dynamicNavbar && animatePages) {\n                app.router.prepareNavbar(newNavbarInner, oldNavbarInner, 'right');\n            }\n            // Force reLayout\n            var clientLeft = newPage[0].clientLeft;\n        \n            // Before Anim Callback\n            app.pageAnimCallback('before', view, {\n                pageContainer: newPage[0],\n                url: url,\n                position: 'right',\n                oldPage: oldPage,\n                newPage: newPage,\n                query: options.query,\n                fromPage: oldPage && oldPage.length && oldPage[0].f7PageData\n            });\n        \n            function afterAnimation() {\n                view.allowPageChange = true;\n                newPage.removeClass('page-from-right-to-center page-on-right page-on-left').addClass('page-on-center');\n                oldPage.removeClass('page-from-center-to-left page-on-center page-on-right').addClass('page-on-left');\n                if (dynamicNavbar) {\n                    newNavbarInner.removeClass('navbar-from-right-to-center navbar-on-left navbar-on-right').addClass('navbar-on-center');\n                    oldNavbarInner.removeClass('navbar-from-center-to-left navbar-on-center navbar-on-right').addClass('navbar-on-left');\n                }\n                app.pageAnimCallback('after', view, {\n                    pageContainer: newPage[0],\n                    url: url,\n                    position: 'right',\n                    oldPage: oldPage,\n                    newPage: newPage,\n                    query: options.query,\n                    fromPage: oldPage && oldPage.length && oldPage[0].f7PageData\n                });\n                if (app.params.pushState && view.main) app.pushStateClearQueue();\n                if (!(view.params.swipeBackPage || view.params.preloadPreviousPage)) {\n                    if (view.params.domCache) {\n                        oldPage.addClass('cached');\n                        if (dynamicNavbar) oldNavbarInner.addClass('cached');\n                    }\n                    else {\n                        if (!(url.indexOf('#') === 0 && newPage.attr('data-page').indexOf('smart-select-') === 0)) {\n                            app.pageRemoveCallback(view, oldPage[0], 'left');\n                            if (dynamicNavbar) app.navbarRemoveCallback(view, oldPage[0], navbar[0], oldNavbarInner[0]);\n                            app.router._remove(oldPage);\n                            if (dynamicNavbar) app.router._remove(oldNavbarInner);\n                        }\n                    }\n                }\n                if (view.params.uniqueHistory && historyBecameUnique) {\n                    view.refreshPreviousPage();\n                }\n            }\n            if (animatePages) {\n                // Set pages before animation\n                if (app.params.material && app.params.materialPageLoadDelay) {\n                    setTimeout(function () {\n                        app.router.animatePages(oldPage, newPage, 'to-left', view);\n                    }, app.params.materialPageLoadDelay);\n                }\n                else {\n                    app.router.animatePages(oldPage, newPage, 'to-left', view);\n                }\n        \n                // Dynamic navbar animation\n                if (dynamicNavbar) {\n                    setTimeout(function() {\n                        app.router.animateNavbars(oldNavbarInner, newNavbarInner, 'to-left', view);\n                    }, 0);\n                }\n                newPage.animationEnd(function (e) {\n                    afterAnimation();\n                });\n            }\n            else {\n                if (dynamicNavbar) newNavbarInner.find('.sliding, .sliding .back .icon').transform('');\n                afterAnimation();\n            }\n        \n        };\n        \n        app.router.load = function (view, options) {\n            options = options || {};\n            if (app.router.preroute(view, options)) {\n                return false;\n            }\n            var url = options.url;\n            var content = options.content;\n            var pageName = options.pageName;\n            var pageElement = options.pageElement;\n            if (pageName) {\n                if (pageName.indexOf('?') > 0) {\n                    options.query = $.parseUrlQuery(pageName);\n                    options.pageName = pageName = pageName.split('?')[0];\n                }\n            }\n            var template = options.template;\n            if (view.params.reloadPages === true) options.reload = true;\n        \n            if (!view.allowPageChange) return false;\n            if (url && view.url === url && !options.reload && !view.params.allowDuplicateUrls) return false;\n            view.allowPageChange = false;\n            if (app.xhr && view.xhr && view.xhr === app.xhr) {\n                app.xhr.abort();\n                app.xhr = false;\n            }\n            function proceed(content) {\n                app.router.preprocess(view, content, url, function (content) {\n                    options.content = content;\n                    app.router._load(view, options);\n                });\n            }\n            if (content || pageName || pageElement) {\n                proceed(content);\n                return;\n            }\n            else if (template) {\n                app.router._load(view, options);\n                return;\n            }\n        \n            if (!options.url || options.url === '#') {\n                view.allowPageChange = true;\n                return;\n            }\n            app.get(options.url, view, options.ignoreCache, function (content, error) {\n                if (error) {\n                    view.allowPageChange = true;\n                    return;\n                }\n                proceed(content);\n            });\n        };\n        \n        app.router._back = function (view, options) {\n            options = options || {};\n            var url = options.url,\n                content = options.content,\n                t7_rendered = {content: options.content}, // will be rendered using Template7\n                template = options.template, // Template 7 compiled template\n                animatePages = options.animatePages,\n                preloadOnly = options.preloadOnly,\n                pushState = options.pushState,\n                ignoreCache = options.ignoreCache,\n                force = options.force,\n                pageName = options.pageName,\n                pageElement = options.pageElement;\n        \n            var viewContainer = $(view.container),\n                pagesContainer = $(view.pagesContainer),\n                pagesInView = pagesContainer.children('.page:not(.cached)'),\n                oldPage, newPage, oldNavbarInner, newNavbarInner, navbar, navbarInners, dynamicNavbar, manipulateDom = true;\n        \n            if (typeof animatePages === 'undefined') animatePages = view.params.animatePages;\n        \n            app.pluginHook('routerBack', view, options);\n        \n            // Render with Template7\n            if (app.params.template7Pages && typeof content === 'string' || template) {\n                t7_rendered = app.router.template7Render(view, options);\n                if (t7_rendered.content && !content) {\n                    content = t7_rendered.content;\n                }\n            }\n        \n            // Animation\n            function afterAnimation() {\n                app.pageBackCallback('after', view, {\n                    pageContainer: oldPage[0],\n                    url: url,\n                    position: 'center',\n                    oldPage: oldPage,\n                    newPage: newPage,\n                });\n                app.pageAnimCallback('after', view, {\n                    pageContainer: newPage[0],\n                    url: url,\n                    position: 'left',\n                    oldPage: oldPage,\n                    newPage: newPage,\n                    query: options.query,\n                    fromPage: oldPage && oldPage.length && oldPage[0].f7PageData\n                });\n                app.router.afterBack(view, oldPage[0], newPage[0]);\n            }\n            function animateBack() {\n                // Page before animation callback\n                app.pageBackCallback('before', view, {\n                    pageContainer: oldPage[0],\n                    url: url,\n                    position: 'center',\n                    oldPage: oldPage,\n                    newPage: newPage,\n                });\n                app.pageAnimCallback('before', view, {\n                    pageContainer: newPage[0],\n                    url: url,\n                    position: 'left',\n                    oldPage: oldPage,\n                    newPage: newPage,\n                    query: options.query,\n                    fromPage: oldPage && oldPage.length && oldPage[0].f7PageData\n                });\n        \n                if (animatePages) {\n                    // Set pages before animation\n                    app.router.animatePages(newPage, oldPage, 'to-right', view);\n        \n                    // Dynamic navbar animation\n                    if (dynamicNavbar) {\n                        setTimeout(function () {\n                            app.router.animateNavbars(newNavbarInner, oldNavbarInner, 'to-right', view);\n                        }, 0);\n                    }\n        \n                    newPage.animationEnd(function () {\n                        afterAnimation();\n                    });\n                }\n                else {\n                    if (dynamicNavbar) newNavbarInner.find('.sliding, .sliding .back .icon').transform('');\n                    afterAnimation();\n                }\n            }\n        \n            function parseNewPage() {\n                app.router.temporaryDom.innerHTML = '';\n                // Parse DOM\n                if ((typeof content === 'string') || (url && (typeof content === 'string'))) {\n                    app.router.temporaryDom.innerHTML = t7_rendered.content;\n                } else {\n                    if ('length' in content && content.length > 1) {\n                        for (var ci = 0; ci < content.length; ci++) {\n                            $(app.router.temporaryDom).append(content[ci]);\n                        }\n                    } else {\n                        $(app.router.temporaryDom).append(content);\n                    }\n                }\n                if (pageElement) newPage = $(pageElement);\n                else newPage = app.router.findElement('.page', app.router.temporaryDom, view);\n        \n                if (view.params.dynamicNavbar) {\n                    // Find navbar\n                    newNavbarInner = app.router.findElement('.navbar-inner', app.router.temporaryDom, view);\n                }\n            }\n            function setPages() {\n                // If pages not found or there are still more than one, exit\n                if (!newPage || newPage.length === 0) {\n                    view.allowPageChange = true;\n                    return;\n                }\n                if (view.params.dynamicNavbar && typeof dynamicNavbar === 'undefined') {\n                    if (!newNavbarInner || newNavbarInner.length === 0) {\n                        dynamicNavbar = false;\n                    }\n                    else {\n                        dynamicNavbar = true;\n                    }\n                }\n        \n                newPage.addClass('page-on-left').removeClass('cached');\n                if (dynamicNavbar) {\n                    navbar = viewContainer.children('.navbar');\n                    navbarInners = navbar.find('.navbar-inner:not(.cached)');\n                    newNavbarInner.addClass('navbar-on-left').removeClass('cached');\n                }\n                // Remove/hide previous page in force mode\n                if (force) {\n                    var pageToRemove, navbarToRemove;\n                    pageToRemove = $(pagesInView[pagesInView.length - 2]);\n        \n                    if (dynamicNavbar) navbarToRemove = $(pageToRemove[0] && pageToRemove[0].f7RelatedNavbar || navbarInners[navbarInners.length - 2]);\n                    if (view.params.domCache && view.initialPages.indexOf(pageToRemove[0]) >= 0) {\n                        if (pageToRemove.length && pageToRemove[0] !== newPage[0]) pageToRemove.addClass('cached');\n                        if (dynamicNavbar && navbarToRemove.length && navbarToRemove[0] !== newNavbarInner[0]) {\n                            navbarToRemove.addClass('cached');\n                        }\n                    }\n                    else {\n                        var removeNavbar = dynamicNavbar && navbarToRemove.length;\n                        if (pageToRemove.length) {\n                            app.pageRemoveCallback(view, pageToRemove[0], 'right');\n                            if (removeNavbar) {\n                                app.navbarRemoveCallback(view, pageToRemove[0], navbar[0], navbarToRemove[0]);\n                            }\n                            app.router._remove(pageToRemove);\n                            if (removeNavbar) app.router._remove(navbarToRemove);\n                        }\n                        else if (removeNavbar) {\n                            app.navbarRemoveCallback(view, pageToRemove[0], navbar[0], navbarToRemove[0]);\n                            app.router._remove(navbarToRemove);\n                        }\n                    }\n                    pagesInView = pagesContainer.children('.page:not(.cached)');\n                    if (dynamicNavbar) {\n                        navbarInners = viewContainer.children('.navbar').find('.navbar-inner:not(.cached)');\n                    }\n                    if (view.history.indexOf(url) >= 0) {\n                        view.history = view.history.slice(0, view.history.indexOf(url) + 2);\n                    }\n                    else {\n                        if (view.history[[view.history.length - 2]]) {\n                            view.history[view.history.length - 2] = url;\n                        }\n                        else {\n                            view.history.unshift(url);\n                        }\n                    }\n                }\n        \n                oldPage = $(pagesInView[pagesInView.length - 1]);\n                if (view.params.domCache) {\n                    if (oldPage[0] === newPage[0]) {\n                        oldPage = pagesContainer.children('.page.page-on-center');\n                        if (oldPage.length === 0 && view.activePage) oldPage = $(view.activePage.container);\n                    }\n                }\n        \n                if (dynamicNavbar && !oldNavbarInner) {\n                    oldNavbarInner = $(navbarInners[navbarInners.length - 1]);\n                    if (view.params.domCache) {\n                        if (oldNavbarInner[0] === newNavbarInner[0]) {\n                            oldNavbarInner = navbar.children('.navbar-inner.navbar-on-center:not(.cached)');\n                        }\n                        if (oldNavbarInner.length === 0) {\n                            oldNavbarInner = navbar.children('.navbar-inner[data-page=\"'+oldPage.attr('data-page')+'\"]');\n                        }\n                    }\n                    if (oldNavbarInner.length === 0 || newNavbarInner[0] === oldNavbarInner[0]) dynamicNavbar = false;\n                }\n        \n                if (dynamicNavbar) {\n                    if (manipulateDom) newNavbarInner.insertBefore(oldNavbarInner);\n                    newNavbarInner[0].f7RelatedPage = newPage[0];\n                    newPage[0].f7RelatedNavbar = newNavbarInner[0];\n                }\n                if (manipulateDom) newPage.insertBefore(oldPage);\n        \n                // Page Init Events\n                app.pageInitCallback(view, {\n                    pageContainer: newPage[0],\n                    url: url,\n                    position: 'left',\n                    navbarInnerContainer: dynamicNavbar ? newNavbarInner[0] : undefined,\n                    oldNavbarInnerContainer: dynamicNavbar ? oldNavbarInner && oldNavbarInner[0] : undefined,\n                    context: t7_rendered.context,\n                    query: options.query,\n                    fromPage: oldPage && oldPage.length && oldPage[0].f7PageData,\n                    preloadOnly: preloadOnly\n                });\n                if (dynamicNavbar) {\n                    app.navbarInitCallback(view, newPage[0], navbar[0], newNavbarInner[0], url, 'right');\n                }\n        \n                if (dynamicNavbar && newNavbarInner.hasClass('navbar-on-left') && animatePages) {\n                    app.router.prepareNavbar(newNavbarInner,  oldNavbarInner, 'left');\n                }\n        \n                if (preloadOnly) {\n                    view.allowPageChange = true;\n                    return;\n                }\n        \n                // Update View's URL\n                view.url = url;\n        \n                // Force reLayout\n                var clientLeft = newPage[0].clientLeft;\n        \n                animateBack();\n        \n                // Push state\n                if (app.params.pushState && view.main)  {\n                    if (typeof pushState === 'undefined') pushState = true;\n                    if (!preloadOnly && history.state && pushState) {\n                        history.back();\n                    }\n                }\n                return;\n            }\n        \n            // Simple go back when we have pages on left\n            if (pagesInView.length > 1 && !force) {\n                // Exit if only preloadOnly\n                if (preloadOnly) {\n                    view.allowPageChange = true;\n                    return;\n                }\n                // Update View's URL\n                view.url = view.history[view.history.length - 2];\n                url = view.url;\n        \n                // Define old and new pages\n                newPage = $(pagesInView[pagesInView.length - 2]);\n                oldPage = $(pagesInView[pagesInView.length - 1]);\n        \n                // Dynamic navbar\n                if (view.params.dynamicNavbar) {\n                    dynamicNavbar = true;\n                    // Find navbar\n                    navbarInners = viewContainer.children('.navbar').find('.navbar-inner:not(.cached)');\n                    newNavbarInner = $(navbarInners[0]);\n                    oldNavbarInner = $(navbarInners[1]);\n                    if (newNavbarInner.length === 0 || oldNavbarInner.length === 0 || oldNavbarInner[0] === newNavbarInner[0]) {\n                        dynamicNavbar = false;\n                    }\n                }\n                manipulateDom = false;\n                setPages();\n                return;\n            }\n        \n            if (!force) {\n                // Go back when there is no pages on left\n                if (!preloadOnly) {\n                    view.url = view.history[view.history.length - 2];\n                    url = view.url;\n                }\n        \n                if (content) {\n                    parseNewPage();\n                    setPages();\n                    return;\n                }\n                else if (pageName) {\n                    // Get dom cached pages\n                    newPage = $(viewContainer).find('.page[data-page=\"' + pageName + '\"]');\n                    if (view.params.dynamicNavbar) {\n                        newNavbarInner = $(viewContainer).children('.navbar').find('.navbar-inner[data-page=\"' + pageName + '\"]');\n                        if (newNavbarInner.length === 0 && newPage[0].f7RelatedNavbar) {\n                            newNavbarInner = $(newPage[0].f7RelatedNavbar);\n                        }\n                        if (newNavbarInner.length === 0 && newPage[0].f7PageData) {\n                            newNavbarInner = $(newPage[0].f7PageData.navbarInnerContainer);\n                        }\n                    }\n                    setPages();\n                    return;\n                }\n                else if (url && url in view.pageElementsCache) {\n                    newPage = view.pageElementsCache[url].page;\n                    newNavbarInner = view.pageElementsCache[url].navbarInner;\n                    setPages();\n                    return;\n                }\n                else {\n                    view.allowPageChange = true;\n                    return;\n                }\n            }\n            else {\n                if (url && url === view.url || pageName && view.activePage && view.activePage.name === pageName) {\n                    view.allowPageChange = true;\n                    return;\n                }\n                // Go back with force url\n                if (content) {\n                    parseNewPage();\n                    setPages();\n                    return;\n                }\n                else if (pageName && view.params.domCache) {\n                    if (pageName) url = '#' + pageName;\n        \n                    newPage = $(viewContainer).find('.page[data-page=\"' + pageName + '\"]');\n                    if (newPage[0].f7PageData && newPage[0].f7PageData.url) {\n                        url = newPage[0].f7PageData.url;\n                    }\n                    if (view.params.dynamicNavbar) {\n                        newNavbarInner = $(viewContainer).children('.navbar').find('.navbar-inner[data-page=\"' + pageName + '\"]');\n                        if (newNavbarInner.length === 0 && newPage[0].f7RelatedNavbar) {\n                            newNavbarInner = $(newPage[0].f7RelatedNavbar);\n                        }\n                        if (newNavbarInner.length === 0 && newPage[0].f7PageData) {\n                            newNavbarInner = $(newPage[0].f7PageData.navbarInnerContainer);\n                        }\n                    }\n                    setPages();\n                    return;\n                }\n                else if (pageElement && url) {\n                    newPage = $(pageElement);\n                    if (view.params.dynamicNavbar) {\n                        newNavbarInner = newPage.find('.navbar-inner');\n                        if (newNavbarInner.length > 0) {\n                            newPage.prepend(newNavbarInner);\n                            app.router._remove(newPage.find('.navbar'));\n                        }\n                    }\n                    setPages();\n                    return;\n                }\n                else {\n                    view.allowPageChange = true;\n                    return;\n                }\n            }\n        \n        };\n        app.router.back = function (view, options) {\n            options = options || {};\n            if (app.router.preroute(view, options, true)) {\n                return false;\n            }\n            var url = options.url;\n            var content = options.content;\n            var pageName = options.pageName;\n            var pageElement = options.pageElement;\n            if (pageName) {\n                if (pageName.indexOf('?') > 0) {\n                    options.query = $.parseUrlQuery(pageName);\n                    options.pageName = pageName = pageName.split('?')[0];\n                }\n            }\n            var force = options.force;\n            if (!view.allowPageChange) return false;\n            view.allowPageChange = false;\n            if (app.xhr && view.xhr && view.xhr === app.xhr) {\n                app.xhr.abort();\n                app.xhr = false;\n            }\n            var pagesInView = $(view.pagesContainer).find('.page:not(.cached)');\n        \n            function proceed(content) {\n                app.router.preprocess(view, content, url, function (content) {\n                    options.content = content;\n                    app.router._back(view, options);\n                });\n            }\n            if (pagesInView.length > 1 && !force) {\n                // Simple go back to previos page in view\n                app.router._back(view, options);\n                return;\n            }\n            if (!force) {\n                url = view.history[view.history.length - 2] || options.url;\n                if (!options.url) options.url = url;\n                if (!url) {\n                    view.allowPageChange = true;\n                    return;\n                }\n                if (url.indexOf('#') === 0 && view.contentCache[url]) {\n                    proceed(view.contentCache[url]);\n                    return;\n                }\n                else if (url.indexOf('#') === 0 && view.params.domCache) {\n                    if (!pageName) options.pageName = url.split('#')[1];\n                    proceed();\n                    return;\n                }\n                else if (url && url in view.pageElementsCache) {\n                    proceed();\n                }\n                else if (url.indexOf('#') !== 0) {\n                    // Load ajax page\n                    app.get(options.url, view, options.ignoreCache, function (content, error) {\n                        if (error) {\n                            view.allowPageChange = true;\n                            return;\n                        }\n                        proceed(content);\n                    });\n                    return;\n                }\n            }\n            else {\n                // Go back with force url\n                if (!url && content) {\n                    proceed(content);\n                    return;\n                }\n                else if (!url && pageName) {\n                    if (pageName) url = '#' + pageName;\n                    proceed();\n                    return;\n                }\n                else if (url && pageElement) {\n                    proceed();\n                    return;\n                }\n                else if (url) {\n                    app.get(options.url, view, options.ignoreCache, function (content, error) {\n                        if (error) {\n                            view.allowPageChange = true;\n                            return;\n                        }\n                        proceed(content);\n                    });\n                    return;\n                }\n            }\n            view.allowPageChange = true;\n            return;\n        };\n        \n        app.router.afterBack = function (view, oldPage, newPage) {\n            // Remove old page and set classes on new one\n            oldPage = $(oldPage);\n            newPage = $(newPage);\n        \n            if (view.params.domCache && view.initialPages.indexOf(oldPage[0]) >= 0) {\n                oldPage.removeClass('page-from-center-to-right').addClass('cached');\n            }\n            else {\n                app.pageRemoveCallback(view, oldPage[0], 'right');\n                app.router._remove(oldPage);\n            }\n        \n            newPage.removeClass('page-from-left-to-center page-on-left').addClass('page-on-center');\n            view.allowPageChange = true;\n        \n            // Update View's History\n            var previousURL = view.history.pop();\n        \n            var newNavbar;\n        \n            // Updated dynamic navbar\n            if (view.params.dynamicNavbar) {\n                var inners = $(view.container).children('.navbar').find('.navbar-inner:not(.cached)');\n                var oldNavbar = $(oldPage[0].f7RelatedNavbar || inners[1]);\n                if (view.params.domCache && view.initialNavbars.indexOf(oldNavbar[0]) >= 0) {\n                    oldNavbar.removeClass('navbar-from-center-to-right').addClass('cached');\n                }\n                else {\n                    app.navbarRemoveCallback(view, oldPage[0], undefined, oldNavbar[0]);\n                    app.router._remove(oldNavbar);\n                }\n                newNavbar = $(inners[0]).removeClass('navbar-on-left navbar-from-left-to-center').addClass('navbar-on-center');\n            }\n        \n            // Remove pages in dom cache\n            if (view.params.domCache) {\n                $(view.container).find('.page.cached').each(function () {\n                    var page = $(this);\n                    var index = page.index();\n                    var pageUrl = page[0].f7PageData && page[0].f7PageData.url;\n                    if (pageUrl && view.history.indexOf(pageUrl) < 0 && view.initialPages.indexOf(this) < 0) {\n                        app.pageRemoveCallback(view, page[0], 'right');\n                        if (page[0].f7RelatedNavbar && view.params.dynamicNavbar) app.navbarRemoveCallback(view, page[0], undefined, page[0].f7RelatedNavbar);\n                        app.router._remove(page);\n                        if (page[0].f7RelatedNavbar && view.params.dynamicNavbar) app.router._remove(page[0].f7RelatedNavbar);\n                    }\n                });\n            }\n        \n            // Check previous page is content based only and remove it from content cache\n            if (!view.params.domCache &&\n                previousURL &&\n                previousURL.indexOf('#') > -1 &&\n                (previousURL in view.contentCache) &&\n                // If the same page is in the history multiple times, don't remove it.\n                view.history.indexOf(previousURL) === -1) {\n                view.contentCache[previousURL] = null;\n                delete view.contentCache[previousURL];\n            }\n            if (previousURL &&\n                (previousURL in view.pageElementsCache) &&\n                // If the same page is in the history multiple times, don't remove it.\n                view.history.indexOf(previousURL) === -1) {\n                view.pageElementsCache[previousURL] = null;\n                delete view.pageElementsCache[previousURL];\n            }\n            // Check for context cache\n            if (previousURL &&\n                (previousURL in view.contextCache) &&\n                // If the same page is in the history multiple times, don't remove it.\n                view.history.indexOf(previousURL) === -1) {\n                view.contextCache[previousURL] = null;\n                delete view.contextCache[previousURL];\n            }\n        \n            if (app.params.pushState && view.main) app.pushStateClearQueue();\n        \n            // Preload previous page\n            if (view.params.preloadPreviousPage) {\n                if (view.params.domCache && view.history.length > 1) {\n                    var preloadUrl = view.history[view.history.length - 2];\n                    var previousPage;\n                    var previousNavbar;\n                    if (preloadUrl && view.pagesCache[preloadUrl]) {\n                        // Load by page name\n                        previousPage = $(view.container).find('.page[data-page=\"' + view.pagesCache[preloadUrl] + '\"]');\n                        if (previousPage.next('.page')[0] !== newPage[0]) previousPage.insertBefore(newPage);\n                        if (newNavbar) {\n                            previousNavbar = $(view.container).children('.navbar').find('.navbar-inner[data-page=\"' + view.pagesCache[preloadUrl] + '\"]');\n                            if(!previousNavbar || previousNavbar.length === 0) previousNavbar = newNavbar.prev('.navbar-inner.cached');\n                            if (previousNavbar.next('.navbar-inner')[0] !== newNavbar[0]) previousNavbar.insertBefore(newNavbar);\n                        }\n                    }\n                    else {\n                        // Just load previous page\n                        previousPage = newPage.prev('.page.cached');\n                        if (newNavbar) previousNavbar = newNavbar.prev('.navbar-inner.cached');\n                    }\n                    if (previousPage && previousPage.length > 0) previousPage.removeClass('cached page-on-right page-on-center').addClass('page-on-left');\n                    if (previousNavbar && previousNavbar.length > 0) previousNavbar.removeClass('cached navbar-on-right navbar-on-center').addClass('navbar-on-left');\n                }\n                else {\n                    app.router.back(view, {preloadOnly: true});\n                }\n            }\n        };\n        \n\n        /*======================================================\n        ************   Modals   ************\n        ======================================================*/\n        var _modalTemplateTempDiv = document.createElement('div');\n        app.modalStack = [];\n        app.modalStackClearQueue = function () {\n            if (app.modalStack.length) {\n                (app.modalStack.shift())();\n            }\n        };\n        app.modal = function (params) {\n            params = params || {};\n            var modalHTML = '';\n            if (app.params.modalTemplate) {\n                if (!app._compiledTemplates.modal) app._compiledTemplates.modal = t7.compile(app.params.modalTemplate);\n                modalHTML = app._compiledTemplates.modal(params);\n            }\n            else {\n                var buttonsHTML = '';\n                if (params.buttons && params.buttons.length > 0) {\n                    for (var i = 0; i < params.buttons.length; i++) {\n                        buttonsHTML += '<span class=\"modal-button' + (params.buttons[i].bold ? ' modal-button-bold' : '') + '\">' + params.buttons[i].text + '</span>';\n                    }\n                }\n                var titleHTML = params.title ? '<div class=\"modal-title\">' + params.title + '</div>' : '';\n                var textHTML = params.text ? '<div class=\"modal-text\">' + params.text + '</div>' : '';\n                var afterTextHTML = params.afterText ? params.afterText : '';\n                var noButtons = !params.buttons || params.buttons.length === 0 ? 'modal-no-buttons' : '';\n                var verticalButtons = params.verticalButtons ? 'modal-buttons-vertical': '';\n                var modalButtonsHTML = params.buttons && params.buttons.length > 0 ? '<div class=\"modal-buttons modal-buttons-' + params.buttons.length + ' ' + verticalButtons + '\">' + buttonsHTML + '</div>' : '';\n                modalHTML = '<div class=\"modal ' + noButtons + ' ' + (params.cssClass || '') + '\"><div class=\"modal-inner\">' + (titleHTML + textHTML + afterTextHTML) + '</div>' + modalButtonsHTML + '</div>';\n            }\n        \n            _modalTemplateTempDiv.innerHTML = modalHTML;\n        \n            var modal = $(_modalTemplateTempDiv).children();\n        \n            app.root.append(modal[0]);\n        \n            // Add events on buttons\n            modal.find('.modal-button').each(function (index, el) {\n                $(el).on('click', function (e) {\n                    if (params.buttons[index].close !== false) app.closeModal(modal);\n                    if (params.buttons[index].onClick) params.buttons[index].onClick(modal, e);\n                    if (params.onClick) params.onClick(modal, index);\n                });\n            });\n            app.openModal(modal);\n            return modal[0];\n        };\n        app.alert = function (text, title, callbackOk) {\n            if (typeof title === 'function') {\n                callbackOk = arguments[1];\n                title = undefined;\n            }\n            return app.modal({\n                text: text || '',\n                title: typeof title === 'undefined' ? app.params.modalTitle : title,\n                buttons: [ {text: app.params.modalButtonOk, bold: true, onClick: callbackOk} ]\n            });\n        };\n        app.confirm = function (text, title, callbackOk, callbackCancel) {\n            if (typeof title === 'function') {\n                callbackCancel = arguments[2];\n                callbackOk = arguments[1];\n                title = undefined;\n            }\n            return app.modal({\n                text: text || '',\n                title: typeof title === 'undefined' ? app.params.modalTitle : title,\n                buttons: [\n                    {text: app.params.modalButtonCancel, onClick: callbackCancel},\n                    {text: app.params.modalButtonOk, bold: true, onClick: callbackOk}\n                ]\n            });\n        };\n        app.prompt = function (text, title, callbackOk, callbackCancel) {\n            if (typeof title === 'function') {\n                callbackCancel = arguments[2];\n                callbackOk = arguments[1];\n                title = undefined;\n            }\n            return app.modal({\n                text: text || '',\n                title: typeof title === 'undefined' ? app.params.modalTitle : title,\n                afterText: '<div class=\"input-field\"><input type=\"text\" class=\"modal-text-input\"></div>',\n                buttons: [\n                    {\n                        text: app.params.modalButtonCancel\n                    },\n                    {\n                        text: app.params.modalButtonOk,\n                        bold: true\n                    }\n                ],\n                onClick: function (modal, index) {\n                    if (index === 0 && callbackCancel) callbackCancel($(modal).find('.modal-text-input').val());\n                    if (index === 1 && callbackOk) callbackOk($(modal).find('.modal-text-input').val());\n                }\n            });\n        };\n        app.modalLogin = function (text, title, callbackOk, callbackCancel) {\n            if (typeof title === 'function') {\n                callbackCancel = arguments[2];\n                callbackOk = arguments[1];\n                title = undefined;\n            }\n            return app.modal({\n                text: text || '',\n                title: typeof title === 'undefined' ? app.params.modalTitle : title,\n                afterText: '<div class=\"input-field modal-input-double\"><input type=\"text\" name=\"modal-username\" placeholder=\"' + app.params.modalUsernamePlaceholder + '\" class=\"modal-text-input\"></div><div class=\"input-field modal-input-double\"><input type=\"password\" name=\"modal-password\" placeholder=\"' + app.params.modalPasswordPlaceholder + '\" class=\"modal-text-input\"></div>',\n                buttons: [\n                    {\n                        text: app.params.modalButtonCancel\n                    },\n                    {\n                        text: app.params.modalButtonOk,\n                        bold: true\n                    }\n                ],\n                onClick: function (modal, index) {\n                    var username = $(modal).find('.modal-text-input[name=\"modal-username\"]').val();\n                    var password = $(modal).find('.modal-text-input[name=\"modal-password\"]').val();\n                    if (index === 0 && callbackCancel) callbackCancel(username, password);\n                    if (index === 1 && callbackOk) callbackOk(username, password);\n                }\n            });\n        };\n        app.modalPassword = function (text, title, callbackOk, callbackCancel) {\n            if (typeof title === 'function') {\n                callbackCancel = arguments[2];\n                callbackOk = arguments[1];\n                title = undefined;\n            }\n            return app.modal({\n                text: text || '',\n                title: typeof title === 'undefined' ? app.params.modalTitle : title,\n                afterText: '<div class=\"input-field\"><input type=\"password\" name=\"modal-password\" placeholder=\"' + app.params.modalPasswordPlaceholder + '\" class=\"modal-text-input\"></div>',\n                buttons: [\n                    {\n                        text: app.params.modalButtonCancel\n                    },\n                    {\n                        text: app.params.modalButtonOk,\n                        bold: true\n                    }\n                ],\n                onClick: function (modal, index) {\n                    var password = $(modal).find('.modal-text-input[name=\"modal-password\"]').val();\n                    if (index === 0 && callbackCancel) callbackCancel(password);\n                    if (index === 1 && callbackOk) callbackOk(password);\n                }\n            });\n        };\n        app.showPreloader = function (title) {\n            return app.modal({\n                title: title || app.params.modalPreloaderTitle,\n                text: '<div class=\"preloader\">' + (app.params.material ? app.params.materialPreloaderHtml : '') + '</div>',\n                cssClass: 'modal-preloader'\n            });\n        };\n        app.hidePreloader = function () {\n            app.closeModal('.modal.modal-in');\n        };\n        app.showIndicator = function () {\n            if ($('.preloader-indicator-overlay').length > 0) return;\n            app.root.append('<div class=\"preloader-indicator-overlay\"></div><div class=\"preloader-indicator-modal\"><span class=\"preloader preloader-white\">' + (app.params.material ? app.params.materialPreloaderHtml : '') + '</span></div>');\n        };\n        app.hideIndicator = function () {\n            $('.preloader-indicator-overlay, .preloader-indicator-modal').remove();\n        };\n        // Action Sheet\n        app.actions = function (target, params) {\n            var toPopover = false, modal, groupSelector, buttonSelector;\n            if (arguments.length === 1) {\n                // Actions\n                params = target;\n            }\n            else {\n                // Popover\n                if (app.device.ios) {\n                    if (app.device.ipad) toPopover = true;\n                }\n                else {\n                    if ($(window).width() >= 768) toPopover = true;\n                }\n            }\n            params = params || [];\n        \n            if (params.length > 0 && !$.isArray(params[0])) {\n                params = [params];\n            }\n            var modalHTML;\n            if (toPopover) {\n                var actionsToPopoverTemplate = app.params.modalActionsToPopoverTemplate ||\n                    '<div class=\"popover actions-popover\">' +\n                      '<div class=\"popover-inner\">' +\n                        '{{#each this}}' +\n                        '<div class=\"list-block\">' +\n                          '<ul>' +\n                            '{{#each this}}' +\n                            '{{#if label}}' +\n                            '<li class=\"actions-popover-label {{#if color}}color-{{color}}{{/if}} {{#if bold}}actions-popover-bold{{/if}}\">{{text}}</li>' +\n                            '{{else}}' +\n                            '<li><a href=\"#\" class=\"item-link list-button {{#if color}}color-{{color}}{{/if}} {{#if bg}}bg-{{bg}}{{/if}} {{#if bold}}actions-popover-bold{{/if}} {{#if disabled}}disabled{{/if}}\">{{text}}</a></li>' +\n                            '{{/if}}' +\n                            '{{/each}}' +\n                          '</ul>' +\n                        '</div>' +\n                        '{{/each}}' +\n                      '</div>' +\n                    '</div>';\n                if (!app._compiledTemplates.actionsToPopover) {\n                    app._compiledTemplates.actionsToPopover = t7.compile(actionsToPopoverTemplate);\n                }\n                var popoverHTML = app._compiledTemplates.actionsToPopover(params);\n                modal = $(app.popover(popoverHTML, target, true));\n                groupSelector = '.list-block ul';\n                buttonSelector = '.list-button';\n            }\n            else {\n                if (app.params.modalActionsTemplate) {\n                    if (!app._compiledTemplates.actions) app._compiledTemplates.actions = t7.compile(app.params.modalActionsTemplate);\n                    modalHTML = app._compiledTemplates.actions(params);\n                }\n                else {\n                    var buttonsHTML = '';\n                    for (var i = 0; i < params.length; i++) {\n                        for (var j = 0; j < params[i].length; j++) {\n                            if (j === 0) buttonsHTML += '<div class=\"actions-modal-group\">';\n                            var button = params[i][j];\n                            var buttonClass = button.label ? 'actions-modal-label' : 'actions-modal-button';\n                            if (button.bold) buttonClass += ' actions-modal-button-bold';\n                            if (button.color) buttonClass += ' color-' + button.color;\n                            if (button.bg) buttonClass += ' bg-' + button.bg;\n                            if (button.disabled) buttonClass += ' disabled';\n                            buttonsHTML += '<div class=\"' + buttonClass + '\">' + button.text + '</div>';\n                            if (j === params[i].length - 1) buttonsHTML += '</div>';\n                        }\n                    }\n                    modalHTML = '<div class=\"actions-modal\">' + buttonsHTML + '</div>';\n                }\n                _modalTemplateTempDiv.innerHTML = modalHTML;\n                modal = $(_modalTemplateTempDiv).children();\n                app.root.append(modal[0]);\n                groupSelector = '.actions-modal-group';\n                buttonSelector = '.actions-modal-button';\n            }\n        \n            var groups = modal.find(groupSelector);\n            groups.each(function (index, el) {\n                var groupIndex = index;\n                $(el).children().each(function (index, el) {\n                    var buttonIndex = index;\n                    var buttonParams = params[groupIndex][buttonIndex];\n                    var clickTarget;\n                    if (!toPopover && $(el).is(buttonSelector)) clickTarget = $(el);\n                    if (toPopover && $(el).find(buttonSelector).length > 0) clickTarget = $(el).find(buttonSelector);\n        \n                    if (clickTarget) {\n                        clickTarget.on('click', function (e) {\n                            if (buttonParams.close !== false) app.closeModal(modal);\n                            if (buttonParams.onClick) buttonParams.onClick(modal, e);\n                        });\n                    }\n                });\n            });\n            if (!toPopover) app.openModal(modal);\n            return modal[0];\n        };\n        app.popover = function (modal, target, removeOnClose) {\n            if (typeof removeOnClose === 'undefined') removeOnClose = true;\n            if (typeof modal === 'string' && modal.indexOf('<') >= 0) {\n                var _modal = document.createElement('div');\n                _modal.innerHTML = modal.trim();\n                if (_modal.childNodes.length > 0) {\n                    modal = _modal.childNodes[0];\n                    if (removeOnClose) modal.classList.add('remove-on-close');\n                    app.root.append(modal);\n                }\n                else return false; //nothing found\n            }\n            modal = $(modal);\n            target = $(target);\n            if (modal.length === 0 || target.length === 0) return false;\n            if (modal.parents('body').length === 0) {\n                if (removeOnClose) modal.addClass('remove-on-close');\n                app.root.append(modal[0]);\n            }\n            if (modal.find('.popover-angle').length === 0 && !app.params.material) {\n                modal.append('<div class=\"popover-angle\"></div>');\n            }\n            modal.show();\n        \n            var material = app.params.material;\n        \n            function sizePopover() {\n                modal.css({left: '', top: ''});\n                var modalWidth =  modal.width();\n                var modalHeight =  modal.height(); // 13 - height of angle\n                var modalAngle, modalAngleSize = 0, modalAngleLeft, modalAngleTop;\n                if (!material) {\n                    modalAngle = modal.find('.popover-angle');\n                    modalAngleSize = modalAngle.width() / 2;\n                    modalAngle.removeClass('on-left on-right on-top on-bottom').css({left: '', top: ''});\n                }\n                else {\n                    modal.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom').css({left: '', top: ''});\n                }\n        \n                var targetWidth = target.outerWidth();\n                var targetHeight = target.outerHeight();\n                var targetOffset = target.offset();\n                var targetParentPage = target.parents('.page');\n                if (targetParentPage.length > 0) {\n                    targetOffset.top = targetOffset.top - targetParentPage[0].scrollTop;\n                }\n        \n                var windowHeight = $(window).height();\n                var windowWidth = $(window).width();\n        \n                var modalTop = 0;\n                var modalLeft = 0;\n                var diff = 0;\n                // Top Position\n                var modalPosition = material ? 'bottom' : 'top';\n                if (material) {\n                    if (modalHeight < windowHeight - targetOffset.top - targetHeight) {\n                        // On bottom\n                        modalPosition = 'bottom';\n                        modalTop = targetOffset.top;\n                    }\n                    else if (modalHeight < targetOffset.top) {\n                        // On top\n                        modalTop = targetOffset.top - modalHeight + targetHeight;\n                        modalPosition = 'top';\n                    }\n                    else {\n                        // On middle\n                        modalPosition = 'bottom';\n                        modalTop = targetOffset.top;\n                    }\n        \n                    if (modalTop <= 0) {\n                        modalTop = 8;\n                    }\n                    else if (modalTop + modalHeight >= windowHeight) {\n                        modalTop = windowHeight - modalHeight - 8;\n                    }\n        \n                    // Horizontal Position\n                    modalLeft = targetOffset.left;\n                    if (modalLeft + modalWidth >= windowWidth - 8) {\n                        modalLeft = targetOffset.left + targetWidth - modalWidth - 8;\n                    }\n                    if (modalLeft < 8) {\n                        modalLeft = 8;\n                    }\n                    if (modalPosition === 'top') {\n                        modal.addClass('popover-on-top');\n                    }\n                    if (modalPosition === 'bottom') {\n                        modal.addClass('popover-on-bottom');\n                    }\n                    if (target.hasClass('floating-button-to-popover') && !modal.hasClass('modal-in')) {\n                        modal.addClass('popover-floating-button');\n                        var diffX = (modalLeft + modalWidth / 2) - (targetOffset.left + targetWidth / 2),\n                            diffY = (modalTop + modalHeight / 2) - (targetOffset.top + targetHeight / 2);\n                        target\n                            .addClass('floating-button-to-popover-in')\n                            .transform('translate3d(' + diffX + 'px, ' + diffY + 'px,0)')\n                            .transitionEnd(function (e) {\n                                if (!target.hasClass('floating-button-to-popover-in')) return;\n                                target\n                                    .addClass('floating-button-to-popover-scale')\n                                    .transform('translate3d(' + diffX + 'px, ' + diffY + 'px,0) scale(' + (modalWidth/targetWidth) + ', ' + (modalHeight/targetHeight) + ')');\n                            });\n        \n                        modal.once('close', function () {\n                            target\n                                .removeClass('floating-button-to-popover-in floating-button-to-popover-scale')\n                                .addClass('floating-button-to-popover-out')\n                                .transform('')\n                                .transitionEnd(function (e) {\n                                    target.removeClass('floating-button-to-popover-out');\n                                });\n                        });\n                        modal.once('closed', function () {\n                            modal.removeClass('popover-floating-button');\n                        });\n                    }\n        \n                }\n                else {\n                    if ((modalHeight + modalAngleSize) < targetOffset.top) {\n                        // On top\n                        modalTop = targetOffset.top - modalHeight - modalAngleSize;\n                    }\n                    else if ((modalHeight + modalAngleSize) < windowHeight - targetOffset.top - targetHeight) {\n                        // On bottom\n                        modalPosition = 'bottom';\n                        modalTop = targetOffset.top + targetHeight + modalAngleSize;\n                    }\n                    else {\n                        // On middle\n                        modalPosition = 'middle';\n                        modalTop = targetHeight / 2 + targetOffset.top - modalHeight / 2;\n                        diff = modalTop;\n                        if (modalTop <= 0) {\n                            modalTop = 5;\n                        }\n                        else if (modalTop + modalHeight >= windowHeight) {\n                            modalTop = windowHeight - modalHeight - 5;\n                        }\n                        diff = diff - modalTop;\n                    }\n        \n                    // Horizontal Position\n                    if (modalPosition === 'top' || modalPosition === 'bottom') {\n                        modalLeft = targetWidth / 2 + targetOffset.left - modalWidth / 2;\n                        diff = modalLeft;\n                        if (modalLeft < 5) modalLeft = 5;\n                        if (modalLeft + modalWidth > windowWidth) modalLeft = windowWidth - modalWidth - 5;\n                        if (modalPosition === 'top') {\n                            modalAngle.addClass('on-bottom');\n                        }\n                        if (modalPosition === 'bottom') {\n                            modalAngle.addClass('on-top');\n                        }\n                        diff = diff - modalLeft;\n                        modalAngleLeft = (modalWidth / 2 - modalAngleSize + diff);\n                        modalAngleLeft = Math.max(Math.min(modalAngleLeft, modalWidth - modalAngleSize * 2 - 13), 13);\n                        modalAngle.css({left: modalAngleLeft + 'px'});\n        \n                    }\n                    else if (modalPosition === 'middle') {\n                        modalLeft = targetOffset.left - modalWidth - modalAngleSize;\n                        modalAngle.addClass('on-right');\n                        if (modalLeft < 5 || (modalLeft + modalWidth > windowWidth)) {\n                            if (modalLeft < 5) modalLeft = targetOffset.left + targetWidth + modalAngleSize;\n                            if (modalLeft + modalWidth > windowWidth) modalLeft = windowWidth - modalWidth - 5;\n                            modalAngle.removeClass('on-right').addClass('on-left');\n                        }\n                        modalAngleTop = (modalHeight / 2 - modalAngleSize + diff);\n                        modalAngleTop = Math.max(Math.min(modalAngleTop, modalHeight - modalAngleSize * 2 - 13), 13);\n                        modalAngle.css({top: modalAngleTop + 'px'});\n                    }\n                }\n        \n        \n                // Apply Styles\n                modal.css({top: modalTop + 'px', left: modalLeft + 'px'});\n            }\n        \n            sizePopover();\n        \n            $(window).on('resize', sizePopover);\n        \n            modal.on('close', function () {\n                $(window).off('resize', sizePopover);\n            });\n        \n            app.openModal(modal);\n            return modal[0];\n        };\n        app.popup = function (modal, removeOnClose) {\n            if (typeof removeOnClose === 'undefined') removeOnClose = true;\n            if (typeof modal === 'string' && modal.indexOf('<') >= 0) {\n                var _modal = document.createElement('div');\n                _modal.innerHTML = modal.trim();\n                if (_modal.childNodes.length > 0) {\n                    modal = _modal.childNodes[0];\n                    if (removeOnClose) modal.classList.add('remove-on-close');\n                    app.root.append(modal);\n                }\n                else return false; //nothing found\n            }\n            modal = $(modal);\n            if (modal.length === 0) return false;\n            if (modal.parents('body').length === 0) {\n                if (removeOnClose) modal.addClass('remove-on-close');\n                app.root.append(modal[0]);\n            }\n            modal.show();\n        \n            app.openModal(modal);\n            return modal[0];\n        };\n        app.pickerModal = function (modal, removeOnClose) {\n            if (typeof removeOnClose === 'undefined') removeOnClose = true;\n            if (typeof modal === 'string' && modal.indexOf('<') >= 0) {\n                modal = $(modal);\n                if (modal.length > 0) {\n                    if (removeOnClose) modal.addClass('remove-on-close');\n                    app.root.append(modal[0]);\n                }\n                else return false; //nothing found\n            }\n            modal = $(modal);\n            if (modal.length === 0) return false;\n            if (modal.parents('body').length === 0) {\n                if (removeOnClose) modal.addClass('remove-on-close');\n                app.root.append(modal[0]);\n            }\n            if ($('.picker-modal.modal-in:not(.modal-out)').length > 0 && !modal.hasClass('modal-in')) {\n                app.closeModal('.picker-modal.modal-in:not(.modal-out)');\n            }\n            modal.show();\n            app.openModal(modal);\n            return modal[0];\n        };\n        app.loginScreen = function (modal) {\n            if (!modal) modal = '.login-screen';\n            modal = $(modal);\n            if (modal.length === 0) return false;\n            if ($('.login-screen.modal-in:not(.modal-out)').length > 0 && !modal.hasClass('modal-in')) {\n                app.closeModal('.login-screen.modal-in:not(.modal-out)');\n            }\n            modal.show();\n            \n            app.openModal(modal);\n            return modal[0];\n        };\n        app.openModal = function (modal) {\n            modal = $(modal);\n            var isModal = modal.hasClass('modal');\n            if ($('.modal.modal-in:not(.modal-out)').length && app.params.modalStack && isModal) {\n                app.modalStack.push(function () {\n                    app.openModal(modal);\n                });\n                return;\n            }\n            // do nothing if this modal already shown\n            if (true === modal.data('f7-modal-shown')) {\n                return;\n            }\n            modal.data('f7-modal-shown', true);\n            modal.once('close', function() {\n               modal.removeData('f7-modal-shown');\n            });\n            var isPopover = modal.hasClass('popover');\n            var isPopup = modal.hasClass('popup');\n            var isLoginScreen = modal.hasClass('login-screen');\n            var isPickerModal = modal.hasClass('picker-modal');\n            if (isModal) {\n                modal.show();\n                modal.css({\n                    marginTop: - Math.round(modal.outerHeight() / 2) + 'px'\n                });\n            }\n        \n            var overlay;\n            if (!isLoginScreen && !isPickerModal) {\n                if ($('.modal-overlay').length === 0 && !isPopup) {\n                    app.root.append('<div class=\"modal-overlay\"></div>');\n                }\n                if ($('.popup-overlay').length === 0 && isPopup) {\n                    app.root.append('<div class=\"popup-overlay\"></div>');\n                }\n                overlay = isPopup ? $('.popup-overlay') : $('.modal-overlay');\n            }\n            if (app.params.material && isPickerModal) {\n                if (modal.hasClass('picker-calendar')) {\n                    if ($('.picker-modal-overlay').length === 0 && !isPopup) {\n                        app.root.append('<div class=\"picker-modal-overlay\"></div>');\n                    }\n                    overlay = $('.picker-modal-overlay');\n                }\n            }\n        \n            //Make sure that styles are applied, trigger relayout;\n            var clientLeft = modal[0].clientLeft;\n        \n            // Trugger open event\n            modal.trigger('open');\n        \n            // Picker modal body class\n            if (isPickerModal) {\n                $('body').addClass('with-picker-modal');\n            }\n        \n            // Init Pages and Navbars in modal\n            if (modal.find('.' + app.params.viewClass).length > 0) {\n                modal.find('.page').each(function () {\n                    app.initPageWithCallback(this);\n                });\n                modal.find('.navbar').each(function () {\n                    app.initNavbarWithCallback(this); \n                });\n            }\n        \n            // Classes for transition in\n            if (!isLoginScreen && !isPickerModal) overlay.addClass('modal-overlay-visible');\n            if (app.params.material && isPickerModal && overlay) overlay.addClass('modal-overlay-visible');\n            modal.removeClass('modal-out').addClass('modal-in').transitionEnd(function (e) {\n                if (modal.hasClass('modal-out')) modal.trigger('closed');\n                else modal.trigger('opened');\n            });\n            return true;\n        };\n        app.closeModal = function (modal) {\n            modal = $(modal || '.modal-in');\n            if (typeof modal !== 'undefined' && modal.length === 0) {\n                return;\n            }\n            var isModal = modal.hasClass('modal');\n            var isPopover = modal.hasClass('popover');\n            var isPopup = modal.hasClass('popup');\n            var isLoginScreen = modal.hasClass('login-screen');\n            var isPickerModal = modal.hasClass('picker-modal');\n        \n            var removeOnClose = modal.hasClass('remove-on-close');\n        \n            var overlay;\n            \n            if (isPopup) overlay = $('.popup-overlay');\n            else {\n                if (isPickerModal && app.params.material) overlay = $('.picker-modal-overlay');\n                else if (!isPickerModal) overlay = $('.modal-overlay');\n            }\n        \n            if (isPopup){\n                if (modal.length === $('.popup.modal-in').length) {\n                    overlay.removeClass('modal-overlay-visible');\n                }\n            }\n            else if (overlay && overlay.length > 0) {\n                overlay.removeClass('modal-overlay-visible');\n            }\n        \n            modal.trigger('close');\n        \n            // Picker modal body class\n            if (isPickerModal) {\n                $('body').removeClass('with-picker-modal');\n                $('body').addClass('picker-modal-closing');\n            }\n        \n            if (!(isPopover && !app.params.material)) {\n                modal.removeClass('modal-in').addClass('modal-out').transitionEnd(function (e) {\n                    if (modal.hasClass('modal-out')) modal.trigger('closed');\n                    else {\n                        modal.trigger('opened');\n                        if (isPopover) return;\n                    }\n        \n                    if (isPickerModal) {\n                        $('body').removeClass('picker-modal-closing');\n                    }\n                    if (isPopup || isLoginScreen || isPickerModal || isPopover) {\n                        modal.removeClass('modal-out').hide();\n                        if (removeOnClose && modal.length > 0) {\n                            modal.remove();\n                        }\n                    }\n                    else {\n                        modal.remove();\n                    }\n                });\n                if (isModal && app.params.modalStack) {\n                    app.modalStackClearQueue();\n                }\n            }\n            else {\n                modal.removeClass('modal-in modal-out').trigger('closed').hide();\n                if (removeOnClose) {\n                    modal.remove();\n                }\n            }\n            return true;\n        };\n        \n\n        /*===============================================================================\n        ************   Progress Bar   ************\n        ===============================================================================*/\n        app.setProgressbar = function (container, progress, speed) {\n            container = $(container || app.root);\n            if (container.length === 0) return;\n            if (progress) progress = Math.min(Math.max(progress, 0), 100);\n            var progressbar;\n            if (container.hasClass('progressbar')) progressbar = container;\n            else {\n                progressbar = container.children('.progressbar');\n            }\n            if (progressbar.length === 0 || progressbar.hasClass('progressbar-infinite')) return;\n            var clientLeft = progressbar[0].clientLeft;\n            progressbar.children('span').transform('translate3d(' + (-100 + progress) + '%,0,0)');\n            if (typeof speed !== 'undefined') {\n                progressbar.children('span').transition(speed);\n            }\n            else {\n                progressbar.children('span').transition('');\n            }\n            return progressbar[0];\n        };\n        app.showProgressbar = function (container, progress, color) {\n            if (typeof container === 'number') {\n                container = app.root;\n                progress = arguments[0];\n                color = arguments[1];\n            }\n            if (progress && typeof progress === 'string' && parseFloat(progress) !== progress * 1) {\n                color = progress;\n                progress = undefined;\n            }\n            container = $(container || app.root);\n            if (container.length === 0) return;\n            var progressbar;\n            if (container.hasClass('progressbar')) progressbar = container;\n            else {\n                progressbar = container.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');\n                if (progressbar.length === 0) {\n                    // Create one\n                    if (typeof progress !== 'undefined') {\n                        // Determined\n                        progressbar = $('<span class=\"progressbar progressbar-in' + (color ? ' color-' + color : '') + '\"><span></span></span>');\n                    }\n                    else {\n                        // Infinite\n                        progressbar = $('<span class=\"progressbar-infinite progressbar-in' + (color ? ' color-' + color : '') + '\"></span>');\n                    }\n                    container.append(progressbar);\n                }\n            }\n            if (progress) app.setProgressbar(container, progress);\n            return progressbar[0];\n        };\n        app.hideProgressbar = function (container) {\n            container = $(container || app.root);\n            if (container.length === 0) return;\n            var progressbar;\n            if (container.hasClass('progressbar')) progressbar = container;\n            else {\n                progressbar = container.children('.progressbar, .progressbar-infinite');\n            }\n            if (progressbar.length === 0 || !progressbar.hasClass('progressbar-in') || progressbar.hasClass('progressbar-out')) return;\n            progressbar.removeClass('progressbar-in').addClass('progressbar-out').animationEnd(function () {\n                progressbar.remove();\n                progressbar = null;\n            });\n            return;\n        };\n        app.initPageProgressbar = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            pageContainer.find('.progressbar').each(function () {\n                var p = $(this);\n                if (p.children('span').length === 0) p.append('<span></span>');\n                if (p.attr('data-progress')) app.setProgressbar(p, p.attr('data-progress'));\n            });\n        };\n\n        /*======================================================\n        ************   Panels   ************\n        ======================================================*/\n        app.allowPanelOpen = true;\n        app.openPanel = function (panelPosition) {\n            if (!app.allowPanelOpen) return false;\n            var panel = $('.panel-' + panelPosition);\n            if (panel.length === 0 || panel.hasClass('active')) return false;\n            app.closePanel(); // Close if some panel is opened\n            app.allowPanelOpen = false;\n            var effect = panel.hasClass('panel-reveal') ? 'reveal' : 'cover';\n            panel.css({display: 'block'}).addClass('active');\n            panel.trigger('open');\n            if (app.params.material) {\n                $('.panel-overlay').show();\n            }\n            if (panel.find('.' + app.params.viewClass).length > 0) {\n                if (app.sizeNavbars) app.sizeNavbars(panel.find('.' + app.params.viewClass)[0]);\n            }\n        \n            // Trigger reLayout\n            var clientLeft = panel[0].clientLeft;\n            \n            // Transition End;\n            var transitionEndTarget = effect === 'reveal' ? $('.' + app.params.viewsClass) : panel;\n            var openedTriggered = false;\n            \n            function panelTransitionEnd() {\n                transitionEndTarget.transitionEnd(function (e) {\n                    if ($(e.target).is(transitionEndTarget)) {\n                        if (panel.hasClass('active')) {\n                            panel.trigger('opened');\n                        }\n                        else {\n                            panel.trigger('closed');\n                        }\n                        if (app.params.material) $('.panel-overlay').css({display: ''});\n                        app.allowPanelOpen = true;\n                    }\n                    else panelTransitionEnd();\n                });\n            }\n            panelTransitionEnd();\n        \n            $('body').addClass('with-panel-' + panelPosition + '-' + effect);\n            return true;\n        };\n        app.closePanel = function () {\n            var activePanel = $('.panel.active');\n            if (activePanel.length === 0) return false;\n            var effect = activePanel.hasClass('panel-reveal') ? 'reveal' : 'cover';\n            var panelPosition = activePanel.hasClass('panel-left') ? 'left' : 'right';\n            activePanel.removeClass('active');\n            var transitionEndTarget = effect === 'reveal' ? $('.' + app.params.viewsClass) : activePanel;\n            activePanel.trigger('close');\n            app.allowPanelOpen = false;\n        \n            transitionEndTarget.transitionEnd(function () {\n                if (activePanel.hasClass('active')) return;\n                activePanel.css({display: ''});\n                activePanel.trigger('closed');\n                $('body').removeClass('panel-closing');\n                app.allowPanelOpen = true;\n            });\n        \n            $('body').addClass('panel-closing').removeClass('with-panel-' + panelPosition + '-' + effect);\n        };\n        /*======================================================\n        ************   Swipe panels   ************\n        ======================================================*/\n        app.initSwipePanels = function () {\n            var panel, side;\n            if (app.params.swipePanel) {\n                panel = $('.panel.panel-' + app.params.swipePanel);\n                side = app.params.swipePanel;\n                if (panel.length === 0 && side !== 'both') return;\n            }\n            else {\n                if (app.params.swipePanelOnlyClose) {\n                    if ($('.panel').length === 0) return;\n                }\n                else return;\n            }\n        \n            var panelOverlay = $('.panel-overlay');\n            var isTouched, isMoved, isScrolling, touchesStart = {}, touchStartTime, touchesDiff, translate, overlayOpacity, opened, panelWidth, effect, direction;\n            var views = $('.' + app.params.viewsClass);\n        \n            function handleTouchStart(e) {\n                if (!app.allowPanelOpen || (!app.params.swipePanel && !app.params.swipePanelOnlyClose) || isTouched) return;\n                if ($('.modal-in, .photo-browser-in').length > 0) return;\n                if (!(app.params.swipePanelCloseOpposite || app.params.swipePanelOnlyClose)) {\n                    if ($('.panel.active').length > 0 && !panel.hasClass('active')) return;\n                }\n                touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n                touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                if (app.params.swipePanelCloseOpposite || app.params.swipePanelOnlyClose) {\n                    if ($('.panel.active').length > 0) {\n                        side = $('.panel.active').hasClass('panel-left') ? 'left' : 'right';\n                    }\n                    else {\n                        if (app.params.swipePanelOnlyClose) return;\n                        side = app.params.swipePanel;\n                    }\n                    if (!side) return;\n                }\n                panel = $('.panel.panel-' + side);\n                opened = panel.hasClass('active');\n                if (app.params.swipePanelActiveArea && !opened) {\n                    if (side === 'left') {\n                        if (touchesStart.x > app.params.swipePanelActiveArea) return;\n                    }\n                    if (side === 'right') {\n                        if (touchesStart.x < window.innerWidth - app.params.swipePanelActiveArea) return;\n                    }\n                }\n                isMoved = false;\n                isTouched = true;\n                isScrolling = undefined;\n                \n                touchStartTime = (new Date()).getTime();\n                direction = undefined;\n            }\n            function handleTouchMove(e) {\n                if (!isTouched) return;\n                if (e.f7PreventPanelSwipe) return;\n                var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                if (typeof isScrolling === 'undefined') {\n                    isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n                }\n                if (isScrolling) {\n                    isTouched = false;\n                    return;\n                }\n                if (!direction) {\n                    if (pageX > touchesStart.x) {\n                        direction = 'to-right';\n                    }\n                    else {\n                        direction = 'to-left';\n                    }\n        \n                    if(side === 'both'){\n                        if ($('.panel.active').length > 0) {\n                            side = $('.panel.active').hasClass('panel-left') ? 'left' : 'right';\n                        }\n                        else {\n                            side = direction === 'to-right' ? 'left' : 'right';\n                        }\n                        panel = $('.panel.panel-' + side);\n                    }\n        \n                    if (\n                        side === 'left' &&\n                        (\n                            direction === 'to-left' && !panel.hasClass('active')\n                        ) ||\n                        side === 'right' &&\n                        (\n                            direction === 'to-right' && !panel.hasClass('active')\n                        )\n                    )\n                    {\n                        isTouched = false;\n                        return;\n                    }\n                }\n        \n                if (app.params.swipePanelNoFollow) {\n                    var timeDiff = (new Date()).getTime() - touchStartTime;\n                    if (timeDiff < 300) {\n                        if (direction === 'to-left') {\n                            if (side === 'right') app.openPanel(side);\n                            if (side === 'left' && panel.hasClass('active')) app.closePanel();\n                        }\n                        if (direction === 'to-right') {\n                            if (side === 'left') app.openPanel(side);\n                            if (side === 'right' && panel.hasClass('active')) app.closePanel();\n                        }\n                    }\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n        \n                if (!isMoved) {\n                    effect = panel.hasClass('panel-cover') ? 'cover' : 'reveal';\n                    if (!opened) {\n                        panel.show();\n                        panelOverlay.show();\n                    }\n                    panelWidth = panel[0].offsetWidth;\n                    panel.transition(0);\n                    if (panel.find('.' + app.params.viewClass).length > 0) {\n                        if (app.sizeNavbars) app.sizeNavbars(panel.find('.' + app.params.viewClass)[0]);\n                    }\n                }\n        \n                isMoved = true;\n        \n                e.preventDefault();\n                var threshold = opened ? 0 : -app.params.swipePanelThreshold;\n                if (side === 'right') threshold = -threshold;\n                \n                touchesDiff = pageX - touchesStart.x + threshold;\n        \n                if (side === 'right') {\n                    translate = touchesDiff  - (opened ? panelWidth : 0);\n                    if (translate > 0) translate = 0;\n                    if (translate < -panelWidth) {\n                        translate = -panelWidth;\n                    }\n                }\n                else {\n                    translate = touchesDiff  + (opened ? panelWidth : 0);\n                    if (translate < 0) translate = 0;\n                    if (translate > panelWidth) {\n                        translate = panelWidth;\n                    }\n                }\n                if (effect === 'reveal') {\n                    views.transform('translate3d(' + translate + 'px,0,0)').transition(0);\n                    panelOverlay.transform('translate3d(' + translate + 'px,0,0)').transition(0);\n                    \n                    app.pluginHook('swipePanelSetTransform', views[0], panel[0], Math.abs(translate / panelWidth));\n                }\n                else {\n                    panel.transform('translate3d(' + translate + 'px,0,0)').transition(0);\n                    if (app.params.material) {\n                        panelOverlay.transition(0);\n                        overlayOpacity = Math.abs(translate/panelWidth);\n                        panelOverlay.css({opacity: overlayOpacity});\n                    }\n                    app.pluginHook('swipePanelSetTransform', views[0], panel[0], Math.abs(translate / panelWidth));\n                }\n            }\n            function handleTouchEnd(e) {\n                if (!isTouched || !isMoved) {\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n                isTouched = false;\n                isMoved = false;\n                var timeDiff = (new Date()).getTime() - touchStartTime;\n                var action;\n                var edge = (translate === 0 || Math.abs(translate) === panelWidth);\n        \n                if (!opened) {\n                    if (translate === 0) {\n                        action = 'reset';\n                    }\n                    else if (\n                        timeDiff < 300 && Math.abs(translate) > 0 ||\n                        timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2)\n                    ) {\n                        action = 'swap';\n                    }\n                    else {\n                        action = 'reset';\n                    }\n                }\n                else {\n                    if (translate === -panelWidth) {\n                        action = 'reset';\n                    }\n                    else if (\n                        timeDiff < 300 && Math.abs(translate) >= 0 ||\n                        timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2)\n                    ) {\n                        if (side === 'left' && translate === panelWidth) action = 'reset';\n                        else action = 'swap';\n                    }\n                    else {\n                        action = 'reset';\n                    }\n                }\n                if (action === 'swap') {\n                    app.allowPanelOpen = true;\n                    if (opened) {\n                        app.closePanel();\n                        if (edge) {\n                            panel.css({display: ''});\n                            $('body').removeClass('panel-closing');\n                        }\n                    }\n                    else {\n                        app.openPanel(side);\n                    }\n                    if (edge) app.allowPanelOpen = true;\n                }\n                if (action === 'reset') {\n                    if (opened) {\n                        app.allowPanelOpen = true;\n                        app.openPanel(side);\n                    }\n                    else {\n                        app.closePanel();\n                        if (edge) {\n                            app.allowPanelOpen = true;\n                            panel.css({display: ''});\n                        }\n                        else {\n                            var target = effect === 'reveal' ? views : panel;\n                            panel.trigger('close');\n                            $('body').addClass('panel-closing');\n                            target.transitionEnd(function () {\n                                panel.trigger('closed');\n                                panel.css({display: ''});\n                                $('body').removeClass('panel-closing');\n                                app.allowPanelOpen = true;\n                            });\n                        }\n                    }\n                }\n                if (effect === 'reveal') {\n                    views.transition('');\n                    views.transform('');\n                }\n                panel.transition('').transform('');\n                panelOverlay.css({display: ''}).transform('').transition('').css('opacity', '');\n            }\n            var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? {passive: true, capture: false} : false;\n            $(document).on(app.touchEvents.start, handleTouchStart, passiveListener);\n            $(document).on(app.touchEvents.move, handleTouchMove);\n            $(document).on(app.touchEvents.end, handleTouchEnd, passiveListener);\n        };\n        \n\n        /*======================================================\n        ************   Image Lazy Loading   ************\n        ************   Based on solution by Marc Godard, https://github.com/MarcGodard   ************\n        ======================================================*/\n        app.initImagesLazyLoad = function (pageContainer) {\n            pageContainer = $(pageContainer);\n        \n            // Lazy images\n            var lazyLoadImages;\n            if (pageContainer.hasClass('lazy')) {\n                lazyLoadImages = pageContainer;\n                pageContainer = lazyLoadImages.parents('.page');\n            }\n            else {\n                lazyLoadImages = pageContainer.find('.lazy');\n            }\n            if (lazyLoadImages.length === 0) return;\n        \n            // Scrollable page content\n            var pageContent;\n            if (pageContainer.hasClass('page-content'))  {\n                pageContent = pageContainer;\n                pageContainer = pageContainer.parents('.page');\n            }\n            else  {\n                pageContent = pageContainer.find('.page-content');\n            }\n            if (pageContent.length === 0) return;\n        \n            // Placeholder\n            var placeholderSrc = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==';\n            if (typeof app.params.imagesLazyLoadPlaceholder === 'string') {\n                placeholderSrc = app.params.imagesLazyLoadPlaceholder;\n            }\n            if (app.params.imagesLazyLoadPlaceholder !== false) lazyLoadImages.each(function(){\n                if ($(this).attr('data-src')) $(this).attr('src', placeholderSrc);\n            });\n        \n            // load image\n            var imagesSequence = [];\n            var imageIsLoading = false;\n            function loadImage(el) {\n                el = $(el);\n        \n                var bg = el.attr('data-background');\n                var src = bg ? bg : el.attr('data-src');\n                if (!src) return;\n        \n                function onLoad() {\n                    el.removeClass('lazy').addClass('lazy-loaded');\n                    if (bg) {\n                        el.css('background-image', 'url(' + src + ')');\n                    }\n                    else {\n                        el.attr('src', src);\n                    }\n        \n                    if (app.params.imagesLazyLoadSequential) {\n                        imageIsLoading = false;\n                        if (imagesSequence.length > 0) {\n                            loadImage(imagesSequence.shift());\n                        }\n                    }\n                }\n        \n                if (app.params.imagesLazyLoadSequential) {\n                    if (imageIsLoading) {\n                        if (imagesSequence.indexOf(el[0]) < 0) imagesSequence.push(el[0]);\n                        return;\n                    }\n                }\n        \n                // Loading flag\n                imageIsLoading = true;\n                \n                var image = new Image();\n                image.onload = onLoad;\n                image.onerror = onLoad;\n                image.src =src;\n            }\n            function lazyHandler() {\n                lazyLoadImages = pageContainer.find('.lazy');\n                lazyLoadImages.each(function(index, el) {\n                    el = $(el);\n                    if (el.parents('.tab:not(.active)').length > 0) {\n                        return;\n                    }\n                    if (isElementInViewport(el[0])) {\n                        loadImage(el);\n                    }\n                });\n            }\n        \n            function isElementInViewport (el) {\n                var rect = el.getBoundingClientRect();\n                var threshold = app.params.imagesLazyLoadThreshold || 0;\n                return (\n                    rect.top >= (0 - threshold) &&\n                    rect.left >= (0 - threshold) &&\n                    rect.top <= (window.innerHeight + threshold) &&\n                    rect.left <= (window.innerWidth + threshold)\n                );\n            }\n        \n            function attachEvents(destroy) {\n                var method = destroy ? 'off' : 'on';\n                lazyLoadImages[method]('lazy', lazyHandler);\n                lazyLoadImages.parents('.tab')[method]('show', lazyHandler);\n                pageContainer[method]('lazy', lazyHandler);\n                pageContent[method]('lazy', lazyHandler);\n                pageContent[method]('scroll', lazyHandler);\n                $(window)[method]('resize', lazyHandler);\n            }\n            function detachEvents() {\n                attachEvents(true);\n            }\n        \n            // Store detach function\n            pageContainer[0].f7DestroyImagesLazyLoad = detachEvents;\n        \n            // Attach events\n            attachEvents();\n        \n            // Destroy on page remove\n            if (pageContainer.hasClass('page')) {\n                pageContainer.once('pageBeforeRemove', detachEvents);\n            }\n        \n            // Run loader on page load/init\n            lazyHandler();\n        \n            // Run after page animation\n            pageContainer.once('pageAfterAnimation', lazyHandler);\n        };\n        app.destroyImagesLazyLoad = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            if (pageContainer.length > 0 && pageContainer[0].f7DestroyImagesLazyLoad) {\n                pageContainer[0].f7DestroyImagesLazyLoad();\n            }\n        };\n        app.reinitImagesLazyLoad = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            if (pageContainer.length > 0) {\n                pageContainer.trigger('lazy');\n            }\n        };\n\n        /*======================================================\n        ************   Material Preloader   ************\n        ======================================================*/\n        app.initPageMaterialPreloader = function (pageContainer) {\n            $(pageContainer).find('.preloader').each(function () {\n                if ($(this).children().length === 0) {\n                    $(this).html(app.params.materialPreloaderHtml);\n                }\n            });\n        };\n\n        /*======================================================\n        ************   Messages   ************\n        ======================================================*/\n        var Messages = function (container, params) {\n            var defaults = {\n                autoLayout: true,\n                newMessagesFirst: false,\n                scrollMessages: true,\n                scrollMessagesOnlyOnEdge: false,\n                messageTemplate:\n                    '{{#if day}}' +\n                    '<div class=\"messages-date\">{{day}} {{#if time}}, <span>{{time}}</span>{{/if}}</div>' +\n                    '{{/if}}' +\n                    '<div class=\"message message-{{type}} {{#if hasImage}}message-pic{{/if}} {{#if avatar}}message-with-avatar{{/if}} {{#if position}}message-appear-from-{{position}}{{/if}}\">' +\n                        '{{#if name}}<div class=\"message-name\">{{name}}</div>{{/if}}' +\n                        '<div class=\"message-text\">{{text}}{{#if date}}<div class=\"message-date\">{{date}}</div>{{/if}}</div>' +\n                        '{{#if avatar}}<div class=\"message-avatar\" style=\"background-image:url({{avatar}})\"></div>{{/if}}' +\n                        '{{#if label}}<div class=\"message-label\">{{label}}</div>{{/if}}' +\n                    '</div>'\n            };\n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined' || params[def] === null) {\n                    params[def] = defaults[def];\n                }\n            }\n        \n            // Instance\n            var m = this;\n        \n            // Params\n            m.params = params;\n        \n            // Container\n            m.container = $(container);\n            if (m.container.length === 0) return;\n        \n            // Autolayout\n            if (m.params.autoLayout) m.container.addClass('messages-auto-layout');\n        \n            // New messages first\n            if (m.params.newMessagesFirst) m.container.addClass('messages-new-first');\n        \n            // Is In Page\n            m.pageContainer = m.container.parents('.page').eq(0);\n            m.pageContent = m.pageContainer.find('.page-content');\n        \n            // Compiled template\n            m.template = Template7.compile(m.params.messageTemplate);\n        \n            // Auto Layout\n            m.layout = function () {\n                if (!m.container.hasClass('messages-auto-layout')) m.container.addClass('messages-auto-layout');\n                m.container.find('.message').each(function () {\n                    var message = $(this);\n                    if (message.find('.message-text img').length > 0) {\n                        var childNodes = message.find('.message-text')[0].childNodes;\n                        var onlyPic = true;\n                        for (var i = 0 ; i < childNodes.length; i++) {\n                            if (childNodes[i].nodeType === 1 && childNodes[i].nodeName.toLowerCase() !== 'img') onlyPic = false;\n                            if (childNodes[i].nodeType === 3 && childNodes[i].textContent.trim() !== '') onlyPic = false;\n                        }\n                        if (onlyPic) message.addClass('message-pic');\n                        else message.removeClass('message-pic');\n                    }\n                    if (message.find('.message-avatar').length > 0) message.addClass('message-with-avatar');\n                });\n                m.container.find('.message').each(function () {\n                    var message = $(this);\n                    var isSent = message.hasClass('message-sent');\n                    var next = message.next('.message-' + (isSent ? 'sent' : 'received'));\n                    var prev = message.prev('.message-' + (isSent ? 'sent' : 'received'));\n                    if (next.length === 0) {\n                        message.addClass('message-last message-with-tail');\n                    }\n                    else message.removeClass('message-last message-with-tail');\n        \n                    if (prev.length === 0) {\n                        message.addClass('message-first');\n                    }\n                    else message.removeClass('message-first');\n        \n                    if (prev.length > 0 && prev.find('.message-name').length > 0 && message.find('.message-name').length > 0) {\n                        if (prev.find('.message-name').text() !== message.find('.message-name').text()) {\n                            prev.addClass('message-last message-with-tail');\n                            message.addClass('message-first');\n                        }\n                    }\n                });\n            };\n        \n            // Add Message\n            m.appendMessage = function (props, animate) {\n                return m.addMessage(props, 'append', animate);\n            };\n            m.prependMessage = function (props, animate) {\n                return m.addMessage(props, 'prepend', animate);\n            };\n            m.addMessage = function (props, method, animate) {\n                return m.addMessages([props], method, animate);\n            };\n            m.addMessages = function (newMessages, method, animate) {\n                if (typeof animate === 'undefined') {\n                    animate = true;\n                }\n                if (typeof method === 'undefined') {\n                    method = m.params.newMessagesFirst ? 'prepend' : 'append';\n                }\n                var newMessagesHTML = '', i;\n                for (i = 0; i < newMessages.length; i++) {\n                    var props = newMessages[i] || {};\n                    props.type = props.type || 'sent';\n                    if (!props.text) continue;\n                    props.hasImage = props.text.indexOf('<img') >= 0;\n                    if (props.onlyImage === false) props.hasImage = false;\n                    if (animate) props.position = method === 'append' ? 'bottom' : 'top';\n        \n                    newMessagesHTML += m.template(props);\n                }\n                var scrollHeightBefore = m.pageContent[0].scrollHeight,\n                    heightBefore = m.pageContent[0].offsetHeight,\n                    scrollBefore = m.pageContent[0].scrollTop;\n                m.container[method](newMessagesHTML);\n                if (m.params.autoLayout) m.layout();\n                if (method === 'prepend') {\n                    m.pageContent[0].scrollTop = scrollBefore + (m.pageContent[0].scrollHeight - scrollHeightBefore);\n                }\n                if (m.params.scrollMessages && (method === 'append' && !m.params.newMessagesFirst) || (method === 'prepend' && m.params.newMessagesFirst)) {\n                    if (m.params.scrollMessagesOnlyOnEdge) {\n                        var onEdge = false;\n                        if (m.params.newMessagesFirst) {\n                            if (scrollBefore === 0) onEdge = true;\n                        }\n                        else {\n                            if (scrollBefore - (scrollHeightBefore - heightBefore) >= -10) onEdge = true;\n                        }\n                        if (onEdge) m.scrollMessages(animate ? undefined : 0);\n                    }\n                    else m.scrollMessages(animate ? undefined : 0);\n                }\n                var messages = m.container.find('.message');\n                if (newMessages.length === 1) {\n                    return method === 'append' ? messages[messages.length - 1] : messages[0];\n                }\n                else {\n                    var messagesToReturn = [];\n                    if (method === 'append') {\n                        for (i = messages.length - newMessages.length; i < messages.length; i++) {\n                            messagesToReturn.push(messages[i]);\n                        }\n                    }\n                    else {\n                        for (i = 0; i < newMessages.length; i++) {\n                            messagesToReturn.push(messages[i]);\n                        }\n                    }\n                    return messagesToReturn;\n                }\n        \n            };\n            m.removeMessage = function (message) {\n                message = $(message);\n                if (message.length === 0) {\n                    return false;\n                }\n                else {\n                    message.remove();\n                    if (m.params.autoLayout) m.layout();\n                    return true;\n                }\n            };\n            m.removeMessages = function (messages) {\n                m.removeMessage(messages);\n            };\n            m.clean = function () {\n                m.container.html('');\n            };\n        \n            // Scroll\n            m.scrollMessages = function (duration, scrollTop) {\n                if (typeof duration === 'undefined') duration = 400;\n                var currentScroll = m.pageContent[0].scrollTop;\n                var newScroll;\n                if (typeof scrollTop !== 'undefined') newScroll = scrollTop;\n                else {\n                    newScroll = m.params.newMessagesFirst ? 0 : m.pageContent[0].scrollHeight - m.pageContent[0].offsetHeight;\n                    if (newScroll === currentScroll) return;\n                }\n                m.pageContent.scrollTop(newScroll, duration);\n            };\n        \n            // Init Destroy\n            m.init = function () {\n                if (m.params.messages) {\n                    m.addMessages(m.params.messages, undefined, false);\n                }\n                else {\n                    if (m.params.autoLayout) m.layout();\n                    m.scrollMessages(0);\n                }\n        \n            };\n            m.destroy = function () {\n                m = null;\n            };\n        \n            // Init\n            m.init();\n        \n            m.container[0].f7Messages = m;\n            return m;\n        };\n        app.messages = function (container, params) {\n            return new Messages (container, params);\n        };\n        app.initPageMessages = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var messages = pageContainer.find('.messages');\n            if (messages.length === 0) return;\n            if (!messages.hasClass('messages-init')) {\n                return;\n            }\n            var m = app.messages(messages, messages.dataset());\n        \n            // Destroy on page remove\n            function pageBeforeRemove() {\n                m.destroy();\n                pageContainer.off('pageBeforeRemove', pageBeforeRemove);\n            }\n            if (pageContainer.hasClass('page')) {\n                pageContainer.on('pageBeforeRemove', pageBeforeRemove);\n            }\n        };\n        \n\n        /*===============================================================================\n        ************   Swipeout Actions (Swipe to delete)   ************\n        ===============================================================================*/\n        app.swipeoutOpenedEl = undefined;\n        app.allowSwipeout = true;\n        app.initSwipeout = function (swipeoutEl) {\n            var isTouched, isMoved, isScrolling, touchesStart = {}, touchStartTime, touchesDiff, swipeOutEl, swipeOutContent, actionsRight, actionsLeft, actionsLeftWidth, actionsRightWidth, translate, opened, openedActions, buttonsLeft, buttonsRight, direction, overswipeLeftButton, overswipeRightButton, overswipeLeft, overswipeRight, noFoldLeft, noFoldRight;\n            $(document).on(app.touchEvents.start, function (e) {\n                if (app.swipeoutOpenedEl) {\n                    var target = $(e.target);\n                    if (!(\n                        app.swipeoutOpenedEl.is(target[0]) ||\n                        target.parents('.swipeout').is(app.swipeoutOpenedEl) ||\n                        target.hasClass('modal-in') ||\n                        target.hasClass('modal-overlay') ||\n                        target.hasClass('actions-modal') || \n                        target.parents('.actions-modal.modal-in, .modal.modal-in').length > 0\n                        )) {\n                        app.swipeoutClose(app.swipeoutOpenedEl);\n                    }\n                }\n            });\n        \n            function handleTouchStart(e) {\n                if (!app.allowSwipeout) return;\n                isMoved = false;\n                isTouched = true;\n                isScrolling = undefined;\n                touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n                touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                touchStartTime = (new Date()).getTime();\n            }\n            function handleTouchMove(e) {\n                if (!isTouched) return;\n                var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                if (typeof isScrolling === 'undefined') {\n                    isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n                }\n                if (isScrolling) {\n                    isTouched = false;\n                    return;\n                }\n        \n                if (!isMoved) {\n                    if ($('.list-block.sortable-opened').length > 0) return;\n                    /*jshint validthis:true */\n                    swipeOutEl = $(this);\n                    swipeOutContent = swipeOutEl.find('.swipeout-content');\n                    actionsRight = swipeOutEl.find('.swipeout-actions-right');\n                    actionsLeft = swipeOutEl.find('.swipeout-actions-left');\n                    actionsLeftWidth = actionsRightWidth = buttonsLeft = buttonsRight = overswipeRightButton = overswipeLeftButton = null;\n                    noFoldLeft = actionsLeft.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;\n                    noFoldRight = actionsRight.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;\n                    if (actionsLeft.length > 0) {\n                        actionsLeftWidth = actionsLeft.outerWidth();\n                        buttonsLeft = actionsLeft.children('a');\n                        overswipeLeftButton = actionsLeft.find('.swipeout-overswipe');\n                    }\n                    if (actionsRight.length > 0) {\n                        actionsRightWidth = actionsRight.outerWidth();\n                        buttonsRight = actionsRight.children('a');\n                        overswipeRightButton = actionsRight.find('.swipeout-overswipe');\n                    }\n                    opened = swipeOutEl.hasClass('swipeout-opened');\n                    if (opened) {\n                        openedActions = swipeOutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';\n                    }\n                    swipeOutEl.removeClass('transitioning');\n                    if (!app.params.swipeoutNoFollow) {\n                        swipeOutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');\n                        swipeOutEl.removeClass('swipeout-opened');\n                    }\n                }\n                isMoved = true;\n                e.preventDefault();\n                \n                touchesDiff = pageX - touchesStart.x;\n                translate = touchesDiff;\n        \n                if (opened) {\n                    if (openedActions === 'right') translate = translate - actionsRightWidth;\n                    else translate = translate + actionsLeftWidth;\n                }\n        \n                if (translate > 0 && actionsLeft.length === 0 || translate < 0 && actionsRight.length === 0) {\n                    if (!opened) {\n                        isTouched = isMoved = false;\n                        swipeOutContent.transform('');\n                        if (buttonsRight && buttonsRight.length > 0) {\n                            buttonsRight.transform('');\n                        }\n                        if (buttonsLeft && buttonsLeft.length > 0) {\n                            buttonsLeft.transform('');\n                        }\n                        return;\n                    }\n                    translate = 0;\n                }\n        \n                if (translate < 0) direction = 'to-left';\n                else if (translate > 0) direction = 'to-right';\n                else {\n                    if (direction) direction = direction;\n                    else direction = 'to-left';\n                }\n                \n                var i, buttonOffset, progress;\n                \n                e.f7PreventPanelSwipe = true;\n                if (app.params.swipeoutNoFollow) {\n                    if (opened) {\n                        if (openedActions === 'right' && touchesDiff > 0) {\n                            app.swipeoutClose(swipeOutEl);\n                        }\n                        if (openedActions === 'left' && touchesDiff < 0) {\n                            app.swipeoutClose(swipeOutEl);\n                        }\n                    }\n                    else {\n                        if (touchesDiff < 0 && actionsRight.length > 0) {\n                            app.swipeoutOpen(swipeOutEl, 'right');\n                        }\n                        if (touchesDiff > 0 && actionsLeft.length > 0) {\n                            app.swipeoutOpen(swipeOutEl, 'left');\n                        }\n                    }\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n                overswipeLeft = false;\n                overswipeRight = false;\n                var $button;\n                if (actionsRight.length > 0) {\n                    // Show right actions\n                    progress = translate / actionsRightWidth;\n                    if (translate < -actionsRightWidth) {\n                        translate = -actionsRightWidth - Math.pow(-translate - actionsRightWidth, 0.8);\n                        if (overswipeRightButton.length > 0) {\n                            overswipeRight = true;\n                        }\n                    }\n                    for (i = 0; i < buttonsRight.length; i++) {\n                        if (typeof buttonsRight[i]._buttonOffset === 'undefined') {\n                            buttonsRight[i]._buttonOffset = buttonsRight[i].offsetLeft;\n                        }\n                        buttonOffset = buttonsRight[i]._buttonOffset;\n                        $button = $(buttonsRight[i]);\n                        if (overswipeRightButton.length > 0 && $button.hasClass('swipeout-overswipe')) {\n                            $button.css({left: (overswipeRight ? -buttonOffset : 0) + 'px'});\n                            if (overswipeRight) {\n                                $button.addClass('swipeout-overswipe-active');\n                            }\n                            else {\n                                $button.removeClass('swipeout-overswipe-active');   \n                            }\n                        }\n                        $button.transform('translate3d(' + (translate - buttonOffset * (1 + Math.max(progress, -1))) + 'px,0,0)');\n                    }\n                }\n                if (actionsLeft.length > 0) {\n                    // Show left actions\n                    progress = translate / actionsLeftWidth;\n                    if (translate > actionsLeftWidth) {\n                        translate = actionsLeftWidth + Math.pow(translate - actionsLeftWidth, 0.8);\n                        if (overswipeLeftButton.length > 0) {\n                            overswipeLeft = true;\n                        }\n                    }\n                    for (i = 0; i < buttonsLeft.length; i++) {\n                        if (typeof buttonsLeft[i]._buttonOffset === 'undefined') {\n                            buttonsLeft[i]._buttonOffset = actionsLeftWidth - buttonsLeft[i].offsetLeft - buttonsLeft[i].offsetWidth;\n                        }\n                        buttonOffset = buttonsLeft[i]._buttonOffset;\n                        $button = $(buttonsLeft[i]);\n                        if (overswipeLeftButton.length > 0 && $button.hasClass('swipeout-overswipe')) {\n                            $button.css({left: (overswipeLeft ? buttonOffset : 0) + 'px'});\n                            if (overswipeLeft) {\n                                $button.addClass('swipeout-overswipe-active');\n                            }\n                            else {\n                                $button.removeClass('swipeout-overswipe-active');   \n                            }\n                        }\n                        if (buttonsLeft.length > 1) {\n                            $button.css('z-index', buttonsLeft.length - i); \n                        }\n                        $button.transform('translate3d(' + (translate + buttonOffset * (1 - Math.min(progress, 1))) + 'px,0,0)');\n                    }\n                }\n                swipeOutContent.transform('translate3d(' + translate + 'px,0,0)');\n            }\n            function handleTouchEnd(e) {\n                if (!isTouched || !isMoved) {\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n        \n                isTouched = false;\n                isMoved = false;\n                var timeDiff = (new Date()).getTime() - touchStartTime;\n                var action, actionsWidth, actions, buttons, i, noFold;\n                \n                noFold = direction === 'to-left' ? noFoldRight : noFoldLeft;\n                actions = direction === 'to-left' ? actionsRight : actionsLeft;\n                actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;\n        \n                if (\n                    timeDiff < 300 && (touchesDiff < -10 && direction === 'to-left' || touchesDiff > 10 && direction === 'to-right') ||\n                    timeDiff >= 300 && Math.abs(translate) > actionsWidth / 2\n                ) {\n                    action = 'open';\n                }\n                else {\n                    action = 'close';\n                }\n                if (timeDiff < 300) {\n                    if (Math.abs(translate) === 0) action = 'close';\n                    if (Math.abs(translate) === actionsWidth) action = 'open';\n                }\n                \n                if (action === 'open') {\n                    app.swipeoutOpenedEl = swipeOutEl;\n                    swipeOutEl.trigger('open');\n                    swipeOutEl.addClass('swipeout-opened transitioning');\n                    var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;\n                    swipeOutContent.transform('translate3d(' + newTranslate + 'px,0,0)');\n                    actions.addClass('swipeout-actions-opened');\n                    buttons = direction === 'to-left' ? buttonsRight : buttonsLeft;\n                    if (buttons) {\n                        for (i = 0; i < buttons.length; i++) {\n                            $(buttons[i]).transform('translate3d(' + newTranslate + 'px,0,0)');\n                        }\n                    }\n                    if (overswipeRight) {\n                        actionsRight.find('.swipeout-overswipe')[0].click();\n                    }\n                    if (overswipeLeft) {\n                        actionsLeft.find('.swipeout-overswipe')[0].click();\n                    }\n                }\n                else {\n                    swipeOutEl.trigger('close');\n                    app.swipeoutOpenedEl = undefined;\n                    swipeOutEl.addClass('transitioning').removeClass('swipeout-opened');\n                    swipeOutContent.transform('');\n                    actions.removeClass('swipeout-actions-opened');\n                }\n                \n                var buttonOffset;\n                if (buttonsLeft && buttonsLeft.length > 0 && buttonsLeft !== buttons) {\n                    for (i = 0; i < buttonsLeft.length; i++) {\n                        buttonOffset = buttonsLeft[i]._buttonOffset;\n                        if (typeof buttonOffset === 'undefined') {\n                            buttonsLeft[i]._buttonOffset = actionsLeftWidth - buttonsLeft[i].offsetLeft - buttonsLeft[i].offsetWidth;\n                        }\n                        $(buttonsLeft[i]).transform('translate3d(' + (buttonOffset) + 'px,0,0)');\n                    }\n                }\n                if (buttonsRight && buttonsRight.length > 0 && buttonsRight !== buttons) {\n                    for (i = 0; i < buttonsRight.length; i++) {\n                        buttonOffset = buttonsRight[i]._buttonOffset;\n                        if (typeof buttonOffset === 'undefined') {\n                            buttonsRight[i]._buttonOffset = buttonsRight[i].offsetLeft;\n                        }\n                        $(buttonsRight[i]).transform('translate3d(' + (-buttonOffset) + 'px,0,0)');\n                    }\n                }\n                swipeOutContent.transitionEnd(function (e) {\n                    if (opened && action === 'open' || closed && action === 'close') return;\n                    swipeOutEl.trigger(action === 'open' ? 'opened' : 'closed');\n                    if (opened && action === 'close') {\n                        if (actionsRight.length > 0) {\n                            buttonsRight.transform('');\n                        }\n                        if (actionsLeft.length > 0) {\n                            buttonsLeft.transform('');\n                        }\n                    }\n                });\n            }\n            if (swipeoutEl) {\n                $(swipeoutEl).on(app.touchEvents.start, handleTouchStart);\n                $(swipeoutEl).on(app.touchEvents.move, handleTouchMove);\n                $(swipeoutEl).on(app.touchEvents.end, handleTouchEnd);\n            }\n            else {\n                $(document).on(app.touchEvents.start, '.list-block li.swipeout', handleTouchStart);\n                $(document).on(app.touchEvents.move, '.list-block li.swipeout', handleTouchMove);\n                $(document).on(app.touchEvents.end, '.list-block li.swipeout', handleTouchEnd);\n            }\n                \n        };\n        app.swipeoutOpen = function (el, dir, callback) {\n            el = $(el);\n            if (arguments.length === 2) {\n                if (typeof arguments[1] === 'function') {\n                    callback = dir;\n                }\n            }\n        \n            if (el.length === 0) return;\n            if (el.length > 1) el = $(el[0]);\n            if (!el.hasClass('swipeout') || el.hasClass('swipeout-opened')) return;\n            if (!dir) {\n                if (el.find('.swipeout-actions-right').length > 0) dir = 'right';\n                else dir = 'left';\n            }\n            var swipeOutActions = el.find('.swipeout-actions-' + dir);\n            if (swipeOutActions.length === 0) return;\n            var noFold = swipeOutActions.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;\n            el.trigger('open').addClass('swipeout-opened').removeClass('transitioning');\n            swipeOutActions.addClass('swipeout-actions-opened');\n            var buttons = swipeOutActions.children('a');\n            var swipeOutActionsWidth = swipeOutActions.outerWidth();\n            var translate = dir === 'right' ? -swipeOutActionsWidth : swipeOutActionsWidth;\n            var i;\n            if (buttons.length > 1) {\n                for (i = 0; i < buttons.length; i++) {\n                    if (dir === 'right') {\n                        $(buttons[i]).transform('translate3d(' + (- buttons[i].offsetLeft) + 'px,0,0)');\n                    }\n                    else {\n                        $(buttons[i]).css('z-index', buttons.length - i).transform('translate3d(' + (swipeOutActionsWidth - buttons[i].offsetWidth - buttons[i].offsetLeft) + 'px,0,0)');\n                    }\n                }\n                var clientLeft = buttons[1].clientLeft;\n            }\n            el.addClass('transitioning');\n            for (i = 0; i < buttons.length; i++) {\n                $(buttons[i]).transform('translate3d(' + (translate) + 'px,0,0)');\n            }\n            el.find('.swipeout-content').transform('translate3d(' + translate + 'px,0,0)').transitionEnd(function () {\n                el.trigger('opened');\n                if (callback) callback.call(el[0]);\n            });\n            app.swipeoutOpenedEl = el;\n        };\n        app.swipeoutClose = function (el, callback) {\n            el = $(el);\n            if (el.length === 0) return;\n            if (!el.hasClass('swipeout-opened')) return;\n            var dir = el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';\n            var swipeOutActions = el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');\n            var noFold = swipeOutActions.hasClass('swipeout-actions-no-fold') || app.params.swipeoutActionsNoFold;\n            var buttons = swipeOutActions.children('a');\n            var swipeOutActionsWidth = swipeOutActions.outerWidth();\n            app.allowSwipeout = false;\n            el.trigger('close');\n            el.removeClass('swipeout-opened').addClass('transitioning');\n        \n            var closeTO;\n            function onSwipeoutClose() {\n                app.allowSwipeout = true;\n                if (el.hasClass('swipeout-opened')) return;\n                el.removeClass('transitioning');\n                buttons.transform('');\n                el.trigger('closed');\n                if (callback) callback.call(el[0]);\n                if (closeTO) clearTimeout(closeTO);\n            }\n            el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);\n            closeTO = setTimeout(onSwipeoutClose, 500);\n            \n            for (var i = 0; i < buttons.length; i++) {\n                if (dir === 'right') {\n                    $(buttons[i]).transform('translate3d(' + (-buttons[i].offsetLeft) + 'px,0,0)');\n                }\n                else {\n                    $(buttons[i]).transform('translate3d(' + (swipeOutActionsWidth - buttons[i].offsetWidth - buttons[i].offsetLeft) + 'px,0,0)');\n                }\n                $(buttons[i]).css({left:0 + 'px'}).removeClass('swipeout-overswipe-active');\n            }\n            if (app.swipeoutOpenedEl && app.swipeoutOpenedEl[0] === el[0]) app.swipeoutOpenedEl = undefined;\n        };\n        app.swipeoutDelete = function (el, callback) {\n            el = $(el);\n            if (el.length === 0) return;\n            if (el.length > 1) el = $(el[0]);\n            app.swipeoutOpenedEl = undefined;\n            el.trigger('delete');\n            el.css({height: el.outerHeight() + 'px'});\n            var clientLeft = el[0].clientLeft;\n            el.css({height: 0 + 'px'}).addClass('deleting transitioning').transitionEnd(function () {\n                el.trigger('deleted');\n                if (callback) callback.call(el[0]);\n                if (el.parents('.virtual-list').length > 0) {\n                    var virtualList = el.parents('.virtual-list')[0].f7VirtualList;\n                    var virtualIndex = el[0].f7VirtualListIndex;\n                    if (virtualList && typeof virtualIndex !== 'undefined') virtualList.deleteItem(virtualIndex);\n                }\n                else {\n                    if (app.params.swipeoutRemoveWithTimeout) {\n                        setTimeout(function () {\n                            el.remove();\n                        }, 0);\n                    }\n                    else el.remove();\n                }\n            });\n            var translate = '-100%';\n            el.find('.swipeout-content').transform('translate3d(' + translate + ',0,0)');\n        };\n        \n\n        /*===============================================================================\n        ************   Sortable   ************\n        ===============================================================================*/\n        app.sortableToggle = function (sortableContainer) {\n            sortableContainer = $(sortableContainer);\n            if (sortableContainer.length === 0) sortableContainer = $('.list-block.sortable');\n            sortableContainer.toggleClass('sortable-opened');\n            if (sortableContainer.hasClass('sortable-opened')) {\n                sortableContainer.trigger('open');\n            }\n            else {\n                sortableContainer.trigger('close');\n            }\n            return sortableContainer;\n        };\n        app.sortableOpen = function (sortableContainer) {\n            sortableContainer = $(sortableContainer);\n            if (sortableContainer.length === 0) sortableContainer = $('.list-block.sortable');\n            sortableContainer.addClass('sortable-opened');\n            sortableContainer.trigger('open');\n            return sortableContainer;\n        };\n        app.sortableClose = function (sortableContainer) {\n            sortableContainer = $(sortableContainer);\n            if (sortableContainer.length === 0) sortableContainer = $('.list-block.sortable');\n            sortableContainer.removeClass('sortable-opened');\n            sortableContainer.trigger('close');\n            return sortableContainer;\n        };\n        app.initSortable = function () {\n            var isTouched, isMoved, touchStartY, touchesDiff, sortingEl, sortingElHeight, sortingItems, minTop, maxTop, insertAfter, insertBefore, sortableContainer, startIndex;\n            \n            function handleTouchStart(e) {\n                isMoved = false;\n                isTouched = true;\n                touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                /*jshint validthis:true */\n                sortingEl = $(this).parent();\n                startIndex = sortingEl.index();\n                sortingItems = sortingEl.parent().find('li');\n                sortableContainer = sortingEl.parents('.sortable');\n                e.preventDefault();\n                app.allowPanelOpen = app.allowSwipeout = false;\n            }\n            function handleTouchMove(e) {\n                if (!isTouched || !sortingEl) return;\n                var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                if (!isMoved) {\n                    sortingEl.addClass('sorting');\n                    sortableContainer.addClass('sortable-sorting');\n                    minTop = sortingEl[0].offsetTop;\n                    maxTop = sortingEl.parent().height() - sortingEl[0].offsetTop - sortingEl.height();\n                    sortingElHeight = sortingEl[0].offsetHeight;\n                }\n                isMoved = true;\n        \n                e.preventDefault();\n                e.f7PreventPanelSwipe = true;\n                touchesDiff = pageY - touchStartY;\n                var translate = touchesDiff;\n                if (translate < -minTop) translate = -minTop;\n                if (translate > maxTop) translate = maxTop;\n                sortingEl.transform('translate3d(0,' + translate + 'px,0)');\n        \n                insertBefore = insertAfter = undefined;\n        \n                sortingItems.each(function () {\n                    var currentEl = $(this);\n                    if (currentEl[0] === sortingEl[0]) return;\n                    var currentElOffset = currentEl[0].offsetTop;\n                    var currentElHeight = currentEl.height();\n                    var sortingElOffset = sortingEl[0].offsetTop + translate;\n        \n                    if ((sortingElOffset >= currentElOffset - currentElHeight / 2) && sortingEl.index() < currentEl.index()) {\n                        currentEl.transform('translate3d(0, '+(-sortingElHeight)+'px,0)');\n                        insertAfter = currentEl;\n                        insertBefore = undefined;\n                    }\n                    else if ((sortingElOffset <= currentElOffset + currentElHeight / 2) && sortingEl.index() > currentEl.index()) {\n                        currentEl.transform('translate3d(0, '+(sortingElHeight)+'px,0)');\n                        insertAfter = undefined;\n                        if (!insertBefore) insertBefore = currentEl;\n                    }\n                    else {\n                        $(this).transform('translate3d(0, 0%,0)');\n                    }\n                });\n            }\n            function handleTouchEnd(e) {\n                app.allowPanelOpen = app.allowSwipeout = true;\n                if (!isTouched || !isMoved) {\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n                e.preventDefault();\n                sortingItems.transform('');\n                sortingEl.removeClass('sorting');\n                sortableContainer.removeClass('sortable-sorting');\n                var virtualList, oldIndex, newIndex;\n                if (insertAfter) {\n                    sortingEl.insertAfter(insertAfter);\n                    sortingEl.trigger('sort', {startIndex: startIndex, newIndex: sortingEl.index()});\n                }\n                if (insertBefore) {\n                    sortingEl.insertBefore(insertBefore);\n                    sortingEl.trigger('sort', {startIndex: startIndex, newIndex: sortingEl.index()});\n                }\n                if ((insertAfter || insertBefore) && sortableContainer.hasClass('virtual-list')) {\n                    virtualList = sortableContainer[0].f7VirtualList;\n                    oldIndex = sortingEl[0].f7VirtualListIndex;\n                    newIndex = insertBefore ? insertBefore[0].f7VirtualListIndex : insertAfter[0].f7VirtualListIndex;\n                    if (virtualList) virtualList.moveItem(oldIndex, newIndex);\n                }\n                insertAfter = insertBefore = undefined;\n                isTouched = false;\n                isMoved = false;\n            }\n            $(document).on(app.touchEvents.start, '.list-block.sortable .sortable-handler', handleTouchStart);\n            if (app.support.touch) {\n                $(document).on(app.touchEvents.move, '.list-block.sortable .sortable-handler', handleTouchMove);\n                $(document).on(app.touchEvents.end, '.list-block.sortable .sortable-handler', handleTouchEnd);\n            }\n            else {\n                $(document).on(app.touchEvents.move, handleTouchMove);\n                $(document).on(app.touchEvents.end, handleTouchEnd);\n            }\n        };\n        \n\n        /*===============================================================================\n        ************   Smart Select   ************\n        ===============================================================================*/\n        app.initSmartSelects = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var selects;\n            if (pageContainer.is('.smart-select')) {\n                selects = pageContainer;\n            }\n            else {\n                selects = pageContainer.find('.smart-select');\n            }\n            if (selects.length === 0) return;\n        \n            selects.each(function () {\n                var smartSelect = $(this);\n        \n                var $select = smartSelect.find('select');\n                if ($select.length === 0) return;\n        \n                var select = $select[0];\n                if (select.length === 0) return;\n        \n                var valueText = [];\n                for (var i = 0; i < select.length; i++) {\n                    if (select[i].selected) valueText.push(select[i].textContent.trim());\n                }\n        \n                var itemAfter = smartSelect.find('.item-after');\n                if (itemAfter.length === 0) {\n                    smartSelect.find('.item-inner').append('<div class=\"item-after\">' + valueText.join(', ') + '</div>');\n                }\n                else {\n                    var selectedText = itemAfter.text();\n                    if (itemAfter.hasClass('smart-select-value')) {\n                        for (i = 0; i < select.length; i++) {\n                            select[i].selected = select[i].textContent.trim() === selectedText.trim();\n                        }\n                    } else {\n                        itemAfter.text(valueText.join(', '));\n                    }\n                }\n        \n                $select.on('change', function () {\n                    var valueText = [];\n                    for (var i = 0; i < select.length; i++) {\n                        if (select[i].selected) valueText.push(select[i].textContent.trim());\n                    }\n                    smartSelect.find('.item-after').text(valueText.join(', '));\n                });\n        \n            });\n        \n        };\n        app.smartSelectAddOption = function (select, option, index) {\n            select = $(select);\n            var smartSelect = select.parents('.smart-select');\n            if (typeof index === 'undefined') {\n                select.append(option);\n            }\n            else {\n                $(option).insertBefore(select.find('option').eq(index));\n            }\n            app.initSmartSelects(smartSelect);\n            var selectName = smartSelect.find('select').attr('name');\n            var opened = $('.page.smart-select-page[data-select-name=\"' + selectName + '\"]').length > 0;\n            if (opened) {\n                app.smartSelectOpen(smartSelect, true);\n            }\n        };\n        app.smartSelectOpen = function (smartSelect, reLayout) {\n            smartSelect = $(smartSelect);\n            if (smartSelect.length === 0) return;\n        \n            // Find related view\n            var view = smartSelect.parents('.' + app.params.viewClass);\n            if (view.length === 0) return;\n            view = view[0].f7View;\n        \n            // Parameters\n            var openIn = smartSelect.attr('data-open-in') || app.params.smartSelectOpenIn;\n            if (openIn === 'popup') {\n                if ($('.popup.smart-select-popup').length > 0) return;\n            }\n            else if (openIn === 'picker') {\n                if ($('.picker-modal.modal-in').length > 0 && !reLayout){\n                    if (smartSelect[0].f7SmartSelectPicker !== $('.picker-modal.modal-in:not(.modal-out)')[0]) app.closeModal($('.picker-modal.modal-in:not(.modal-out)'));\n                    else return;\n                }\n            }\n            else {\n                if (!view) return;\n            }\n        \n            var smartSelectData = smartSelect.dataset();\n            var pageTitle = smartSelectData.pageTitle || smartSelect.find('.item-title').text();\n            var backText = smartSelectData.backText || app.params.smartSelectBackText;\n            var closeText;\n            if (openIn === 'picker') {\n                closeText = smartSelectData.pickerCloseText || smartSelectData.backText || app.params.smartSelectPickerCloseText ;   \n            }\n            else {\n                closeText = smartSelectData.popupCloseText || smartSelectData.backText || app.params.smartSelectPopupCloseText ;      \n            }\n            var backOnSelect = smartSelectData.backOnSelect !== undefined ? smartSelectData.backOnSelect : app.params.smartSelectBackOnSelect;\n            var formTheme = smartSelectData.formTheme || app.params.smartSelectFormTheme;\n            var navbarTheme = smartSelectData.navbarTheme || app.params.smartSelectNavbarTheme;\n            var toolbarTheme = smartSelectData.toolbarTheme || app.params.smartSelectToolbarTheme;\n            var virtualList = smartSelectData.virtualList;\n            var virtualListHeight = smartSelectData.virtualListHeight;\n            var material = app.params.material;\n            var pickerHeight = smartSelectData.pickerHeight || app.params.smartSelectPickerHeight;\n        \n            // Collect all options/values\n            var select = smartSelect.find('select')[0];\n            var $select = $(select);\n            var $selectData = $select.dataset();\n            if (select.disabled || smartSelect.hasClass('disabled') || $select.hasClass('disabled')) {\n                return;\n            }\n            var values = [];\n            var id = (new Date()).getTime();\n            var inputType = select.multiple ? 'checkbox' : 'radio';\n            var inputName = inputType + '-' + id;\n            var maxLength = $select.attr('maxlength');\n            var selectName = select.name;\n            var option, optionHasMedia, optionImage, optionIcon, optionGroup, optionGroupLabel, optionPreviousGroup, optionIsLabel, previousGroup, optionColor, optionClassName, optionData;\n            for (var i = 0; i < select.length; i++) {\n                option = $(select[i]);\n                optionData = option.dataset();\n                optionImage = optionData.optionImage || $selectData.optionImage || smartSelectData.optionImage;\n                optionIcon = optionData.optionIcon || $selectData.optionIcon || smartSelectData.optionIcon;\n                optionHasMedia = optionImage || optionIcon || inputType === 'checkbox';\n                if (material) optionHasMedia = optionImage || optionIcon;\n                optionColor = optionData.optionColor;\n                optionClassName = optionData.optionClass;\n                if (option[0].disabled) optionClassName += ' disabled';\n                optionGroup = option.parent('optgroup')[0];\n                optionGroupLabel = optionGroup && optionGroup.label;\n                optionIsLabel = false;\n                if (optionGroup) {\n                    if (optionGroup !== previousGroup) {\n                        optionIsLabel = true;\n                        previousGroup = optionGroup;\n                        values.push({\n                            groupLabel: optionGroupLabel,\n                            isLabel: optionIsLabel\n                        });\n                    }\n                }\n                values.push({\n                    value: option[0].value,\n                    text: option[0].textContent.trim(),\n                    selected: option[0].selected,\n                    group: optionGroup,\n                    groupLabel: optionGroupLabel,\n                    image: optionImage,\n                    icon: optionIcon,\n                    color: optionColor,\n                    className: optionClassName,\n                    disabled: option[0].disabled,\n                    inputType: inputType,\n                    id: id,\n                    hasMedia: optionHasMedia,\n                    checkbox: inputType === 'checkbox',\n                    inputName: inputName,\n                    material: app.params.material\n                });\n            }\n        \n        \n            // Item template/HTML\n            if (!app._compiledTemplates.smartSelectItem) {\n                app._compiledTemplates.smartSelectItem = t7.compile(app.params.smartSelectItemTemplate || \n                    '{{#if isLabel}}' +\n                    '<li class=\"item-divider\">{{groupLabel}}</li>' +\n                    '{{else}}' +\n                    '<li{{#if className}} class=\"{{className}}\"{{/if}}>' +\n                        '<label class=\"label-{{inputType}} item-content\">' +\n                            '<input type=\"{{inputType}}\" name=\"{{inputName}}\" value=\"{{value}}\" {{#if selected}}checked{{/if}}>' +\n                            '{{#if material}}' +\n                                '{{#if hasMedia}}' +\n                                '<div class=\"item-media\">' +\n                                    '{{#if icon}}<i class=\"icon {{icon}}\"></i>{{/if}}' +\n                                    '{{#if image}}<img src=\"{{image}}\">{{/if}}' +\n                                '</div>' +\n                                '<div class=\"item-inner\">' +\n                                    '<div class=\"item-title{{#if color}} color-{{color}}{{/if}}\">{{text}}</div>' +\n                                '</div>' +\n                                '<div class=\"item-after\">' +\n                                    '<i class=\"icon icon-form-{{inputType}}\"></i>' +\n                                '</div>' +\n                                '{{else}}' +\n                                '<div class=\"item-media\">' +\n                                    '<i class=\"icon icon-form-{{inputType}}\"></i>' +\n                                '</div>' +\n                                '<div class=\"item-inner\">' +\n                                    '<div class=\"item-title{{#if color}} color-{{color}}{{/if}}\">{{text}}</div>' +\n                                '</div>' +\n                                '{{/if}}' +\n                            '{{else}}' +\n                                '{{#if hasMedia}}' +\n                                '<div class=\"item-media\">' +\n                                    '{{#if checkbox}}<i class=\"icon icon-form-checkbox\"></i>{{/if}}' +\n                                    '{{#if icon}}<i class=\"icon {{icon}}\"></i>{{/if}}' +\n                                    '{{#if image}}<img src=\"{{image}}\">{{/if}}' +\n                                '</div>' +\n                                '{{/if}}' +\n                                '<div class=\"item-inner\">' +\n                                    '<div class=\"item-title{{#if color}} color-{{color}}{{/if}}\">{{text}}</div>' +\n                                '</div>' +\n                            '{{/if}}' +\n                        '</label>' +\n                    '</li>' +\n                    '{{/if}}'\n                );\n            }\n            var smartSelectItemTemplate = app._compiledTemplates.smartSelectItem;\n            \n            var inputsHTML = '';\n            if (!virtualList) {\n                for (var j = 0; j < values.length; j++) {\n                    inputsHTML += smartSelectItemTemplate(values[j]);\n                }\n            }\n        \n            // Toolbar / Navbar\n            var toolbarHTML = '', navbarHTML;\n            var noNavbar = '', noToolbar = '', noTabbar = '', navbarLayout;\n        \n            if (openIn === 'picker') {\n                if (!app._compiledTemplates.smartSelectToolbar) {\n                    app._compiledTemplates.smartSelectToolbar = t7.compile(app.params.smartSelectToolbarTemplate || \n                        '<div class=\"toolbar {{#if toolbarTheme}}theme-{{toolbarTheme}}{{/if}}\">' +\n                          '<div class=\"toolbar-inner\">' +\n                            '<div class=\"left\"></div>' +\n                            '<div class=\"right\"><a href=\"#\" class=\"link close-picker\"><span>{{closeText}}</span></a></div>' +\n                        '</div>' +\n                      '</div>'\n                    );\n                }\n        \n                toolbarHTML = app._compiledTemplates.smartSelectToolbar({\n                    pageTitle: pageTitle,\n                    closeText: closeText,\n                    openIn: openIn,\n                    toolbarTheme: toolbarTheme,\n                    inPicker: openIn === 'picker'              \n                });\n            }\n            else {\n                // Navbar HTML\n                if (!app._compiledTemplates.smartSelectNavbar) {\n                    app._compiledTemplates.smartSelectNavbar = t7.compile(app.params.smartSelectNavbarTemplate || \n                        '<div class=\"navbar {{#if navbarTheme}}theme-{{navbarTheme}}{{/if}}\">' +\n                            '<div class=\"navbar-inner\">' +\n                                '{{leftTemplate}}' +\n                                '<div class=\"center sliding\">{{pageTitle}}</div>' +\n                            '</div>' +\n                        '</div>'\n                    );\n                }\n                navbarHTML = app._compiledTemplates.smartSelectNavbar({\n                    pageTitle: pageTitle,\n                    backText: backText,\n                    closeText: closeText,\n                    openIn: openIn,\n                    navbarTheme: navbarTheme,\n                    inPopup: openIn === 'popup',\n                    inPage: openIn === 'page',\n                    leftTemplate: openIn === 'popup' ? \n                        (app.params.smartSelectPopupCloseTemplate || (material ? '<div class=\"left\"><a href=\"#\" class=\"link close-popup icon-only\"><i class=\"icon icon-back\"></i></a></div>' : '<div class=\"left\"><a href=\"#\" class=\"link close-popup\"><i class=\"icon icon-back\"></i><span>{{closeText}}</span></a></div>')).replace(/{{closeText}}/g, closeText) :\n                        (app.params.smartSelectBackTemplate || (material ? '<div class=\"left\"><a href=\"#\" class=\"back link icon-only\"><i class=\"icon icon-back\"></i></a></div>' : '<div class=\"left sliding\"><a href=\"#\" class=\"back link\"><i class=\"icon icon-back\"></i><span>{{backText}}</span></a></div>')).replace(/{{backText}}/g, backText)\n                });\n                // Determine navbar layout type - static/fixed/through\n                if (openIn === 'page') {\n                    navbarLayout = 'static';\n                    if (smartSelect.parents('.navbar-through').length > 0) navbarLayout = 'through';\n                    if (smartSelect.parents('.navbar-fixed').length > 0) navbarLayout = 'fixed';\n                    noToolbar = smartSelect.parents('.page').hasClass('no-toolbar') ? 'no-toolbar' : '';\n                    noNavbar  = smartSelect.parents('.page').hasClass('no-navbar')  ? 'no-navbar'  : 'navbar-' + navbarLayout;\n                    noTabbar = smartSelect.parents('.page').hasClass('no-tabbar') ? 'no-tabbar' : '';\n                }\n                else {\n                    navbarLayout = 'fixed';\n                }\n            }\n                \n        \n            // Page Layout\n            var pageName = 'smart-select-' + inputName;\n        \n            var useSearchbar = typeof smartSelect.data('searchbar') === 'undefined' ? app.params.smartSelectSearchbar : (smartSelect.data('searchbar') === 'true' ? true : false);\n            var searchbarPlaceholder, searchbarCancel;\n                \n            if (useSearchbar) {\n                searchbarPlaceholder = smartSelect.data('searchbar-placeholder') || 'Search';\n                searchbarCancel = smartSelect.data('searchbar-cancel') || 'Cancel';\n            }\n        \n            var searchbarHTML =   '<form class=\"searchbar searchbar-init\" data-search-list=\".smart-select-list-' + id + '\" data-search-in=\".item-title\">' +\n                                    '<div class=\"searchbar-input\">' +\n                                        '<input type=\"search\" placeholder=\"' + searchbarPlaceholder + '\">' +\n                                        '<a href=\"#\" class=\"searchbar-clear\"></a>' +\n                                    '</div>' +\n                                    (material ? '' : '<a href=\"#\" class=\"searchbar-cancel\">' + searchbarCancel + '</a>') +\n                                  '</form>' +\n                                  '<div class=\"searchbar-overlay\"></div>';\n        \n            var pageHTML =\n                (openIn !== 'picker' && navbarLayout === 'through' ? navbarHTML : '') +\n                '<div class=\"pages\">' +\n                '  <div data-page=\"' + pageName + '\" data-select-name=\"' + selectName + '\" class=\"page smart-select-page ' + noNavbar + ' ' + noToolbar + ' ' + noTabbar + '\">' +\n                     (openIn !== 'picker' && navbarLayout === 'fixed' ? navbarHTML : '') +\n                     (useSearchbar ? searchbarHTML : '') +\n                '    <div class=\"page-content\">' +\n                       (openIn !== 'picker' && navbarLayout === 'static' ? navbarHTML : '') +\n                '      <div class=\"list-block ' + (virtualList ? 'virtual-list' : '') + ' smart-select-list-' + id + ' ' + (formTheme ? 'theme-' + formTheme : '') + '\">' +\n                '        <ul>' +\n                            (virtualList ? '' : inputsHTML) +\n                '        </ul>' +\n                '      </div>' +\n                '    </div>' +\n                '  </div>' +\n                '</div>';\n        \n            // Define popup and picker\n            var popup, picker;\n        \n            // Scroll SS Picker To Input\n            function scrollToInput() {\n                var pageContent = smartSelect.parents('.page-content');\n                if (pageContent.length === 0) return;\n                var paddingTop = parseInt(pageContent.css('padding-top'), 10),\n                    paddingBottom = parseInt(pageContent.css('padding-bottom'), 10),\n                    pageHeight = pageContent[0].offsetHeight - paddingTop - picker.height(),\n                    pageScrollHeight = pageContent[0].scrollHeight - paddingTop - picker.height(),\n                    newPaddingBottom;\n                var inputTop = smartSelect.offset().top - paddingTop + smartSelect[0].offsetHeight;\n                if (inputTop > pageHeight) {\n                    var scrollTop = pageContent.scrollTop() + inputTop - pageHeight;\n                    if (scrollTop + pageHeight > pageScrollHeight) {\n                        newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom;\n                        if (pageHeight === pageScrollHeight) {\n                            newPaddingBottom = picker.height();\n                        }\n                        pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'});\n                    }\n                    pageContent.scrollTop(scrollTop, 300);\n                }\n            }\n            // Close SS Picker on HTML Click\n            function closeOnHTMLClick(e) {\n                var close = true;\n                if (e.target === smartSelect[0] || $(e.target).parents(smartSelect[0]).length > 0) {\n                    close = false;\n                }\n                if ($(e.target).parents('.picker-modal').length > 0) {\n                    close = false;\n                }\n                if (close) {\n                    app.closeModal('.smart-select-picker.modal-in');   \n                }\n            }\n        \n            // Check max length\n            function checkMaxLength(container) {\n                if (select.selectedOptions.length >= maxLength) {\n                    container.find('input[type=\"checkbox\"]').each(function () {\n                        if (!this.checked) {\n                            $(this).parents('li').addClass('disabled');\n                        }\n                        else {\n                            $(this).parents('li').removeClass('disabled');   \n                        }\n                    });\n                }\n                else {\n                    container.find('.disabled').removeClass('disabled');\n                }\n            }\n            // Event Listeners on new page\n            function handleInputs(container) {\n                container = $(container);\n                if (virtualList) {\n                    var virtualListInstance = app.virtualList(container.find('.virtual-list'), {\n                        items: values,\n                        template: smartSelectItemTemplate,\n                        height: virtualListHeight || undefined,\n                        searchByItem: function (query, index, item) {\n                            if (item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >=0 ) return true;\n                            return false;\n                        }\n                    });\n                    container.once(openIn === 'popup' || openIn === 'picker' ? 'closed': 'pageBeforeRemove', function () {\n                        if (virtualListInstance && virtualListInstance.destroy) virtualListInstance.destroy();\n                    });\n                }\n                if (maxLength) {\n                    checkMaxLength(container);\n                }\n                if (backOnSelect) {\n                    container.find('input[type=\"radio\"][name=\"' + inputName + '\"]:checked').parents('label').once('click', function () {\n                        if (openIn === 'popup') app.closeModal(popup);\n                        else if (openIn === 'picker') app.closeModal(picker);\n                        else view.router.back();\n                    });\n                }\n                container.on('change', 'input[name=\"' + inputName + '\"]', function () {\n                    var input = this;\n                    var value = input.value;\n                    var optionText = [];\n                    if (input.type === 'checkbox') {\n                        var values = [];\n                        for (var i = 0; i < select.options.length; i++) {\n                            var option = select.options[i];\n                            if (option.value === value) {\n                                option.selected = input.checked;\n                            }\n                            if (option.selected) {\n                                optionText.push(option.textContent.trim());\n                            }\n                        }\n                        if (maxLength) {\n                            checkMaxLength(container);\n                        }\n                    }\n                    else {\n                        optionText = [smartSelect.find('option[value=\"' + value + '\"]').text()];\n                        select.value = value;\n                    }\n        \n                    $select.trigger('change');\n                    smartSelect.find('.item-after').text(optionText.join(', '));\n                    if (backOnSelect && inputType === 'radio') {\n                        if (openIn === 'popup') app.closeModal(popup);\n                        else if (openIn === 'picker') app.closeModal(picker);\n                        else view.router.back();\n                    }\n                });\n            }\n            function pageInit(e) {\n                var page = e.detail.page;\n                if (page.name === pageName) {\n                    handleInputs(page.container);\n                }\n            }\n            if (openIn === 'popup') {\n                if (reLayout) {\n                    popup = $('.popup.smart-select-popup .view');\n                    popup.html(pageHTML);\n                }\n                else {\n                    popup = app.popup(\n                        '<div class=\"popup smart-select-popup smart-select-popup-' + inputName + '\">' +\n                            '<div class=\"view navbar-fixed\">' +\n                                pageHTML +\n                            '</div>' +\n                        '</div>'\n                        );\n                    popup = $(popup);\n                }\n                app.initPage(popup.find('.page'));\n                handleInputs(popup);\n            }\n            else if (openIn === 'picker') {\n                if (reLayout) {\n                    picker = $('.picker-modal.smart-select-picker .view');\n                    picker.html(pageHTML);\n                }\n                else {\n                    picker = app.pickerModal(\n                        '<div class=\"picker-modal smart-select-picker smart-select-picker-' + inputName + '\"' + (pickerHeight ? ' style=\"height:' + pickerHeight + '\"' : '') + '>' +\n                            toolbarHTML +\n                            '<div class=\"picker-modal-inner\">' +\n                                '<div class=\"view\">' +\n                                    pageHTML +\n                                '</div>' +\n                            '</div>' +\n                        '</div>'\n                        );\n                    picker = $(picker);\n        \n                    // Scroll To Input\n                    scrollToInput();\n        \n                    // Close On Click\n                    $('html').on('click', closeOnHTMLClick);\n        \n                    // On Close\n                    picker.once('close', function () {\n                        // Reset linked picker\n                        smartSelect[0].f7SmartSelectPicker = undefined;\n                        \n                        // Detach html click\n                        $('html').off('click', closeOnHTMLClick);    \n                        \n                        // Restore page padding bottom\n                        smartSelect.parents('.page-content').css({paddingBottom: ''});\n                    });\n        \n                    // Link Picker\n                    smartSelect[0].f7SmartSelectPicker = picker[0];\n                }\n        \n                // Init Page\n                app.initPage(picker.find('.page'));\n        \n                // Attach events\n                handleInputs(picker);\n            }\n            else {\n                $(document).once('pageInit', '.smart-select-page', pageInit);\n                view.router.load({\n                    content: pageHTML,\n                    reload: reLayout ? true : undefined\n                });\n            }\n        };\n        \n\n        /*===============================================================================\n        ************   Virtual List   ************\n        ===============================================================================*/\n        var VirtualList = function (listBlock, params) {\n            var defaults = {\n                cols: 1,\n                height: app.params.material ? 48 : 44,\n                cache: true,\n                dynamicHeightBufferSize: 1,\n                showFilteredItemsOnly: false\n            };\n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined') {\n                    params[def] = defaults[def];\n                }\n            }\n        \n            // Preparation\n            var vl = this;\n            vl.listBlock = $(listBlock);\n            vl.params = params;\n            vl.items = vl.params.items;\n            if (vl.params.showFilteredItemsOnly) {\n                vl.filteredItems = [];\n            }\n            if (vl.params.template) {\n                if (typeof vl.params.template === 'string') vl.template = t7.compile(vl.params.template);\n                else if (typeof vl.params.template === 'function') vl.template = vl.params.template;\n            }\n            vl.pageContent = vl.listBlock.parents('.page-content');\n        \n            // Bad scroll\n            var updatableScroll;\n            if (typeof vl.params.updatableScroll !== 'undefined') {\n                updatableScroll = vl.params.updatableScroll;\n            }\n            else {\n                updatableScroll = true;\n                if (app.device.ios && app.device.osVersion.split('.')[0] < 8) {\n                    updatableScroll = false;\n                }\n            }\n        \n            // Append <ul>\n            vl.ul = vl.params.ul ? $(vl.params.ul) : vl.listBlock.children('ul');\n            if (vl.ul.length === 0) {\n                vl.listBlock.append('<ul></ul>');\n                vl.ul = vl.listBlock.children('ul');\n            }\n        \n            // DOM cached items\n            vl.domCache = {};\n            vl.displayDomCache = {};\n        \n            // Temporary DOM Element\n            vl.tempDomElement = document.createElement('ul');\n        \n            // Last repain position\n            vl.lastRepaintY = null;\n        \n            // Fragment\n            vl.fragment = document.createDocumentFragment();\n        \n            // Filter\n            vl.filterItems = function (indexes, resetScrollTop) {\n                vl.filteredItems = [];\n                var firstIndex = indexes[0];\n                var lastIndex = indexes[indexes.length - 1];\n                for (var i = 0; i < indexes.length; i++) {\n                    vl.filteredItems.push(vl.items[indexes[i]]);\n                }\n                if (typeof resetScrollTop === 'undefined') resetScrollTop = true;\n                if (resetScrollTop) {\n                    vl.pageContent[0].scrollTop = 0;\n                }\n                vl.update();\n            };\n            vl.resetFilter = function () {\n                if (vl.params.showFilteredItemsOnly) {\n                    vl.filteredItems = [];\n                }\n                else {\n                    vl.filteredItems = null;\n                    delete vl.filteredItems;    \n                }\n                vl.update();\n            };\n        \n            var pageHeight, rowsPerScreen, rowsBefore, rowsAfter, rowsToRender, maxBufferHeight = 0, listHeight;\n            var dynamicHeight = typeof vl.params.height === 'function';\n        \n            // Set list size\n            vl.setListSize = function () {\n                var items = vl.filteredItems || vl.items;\n                pageHeight = vl.pageContent[0].offsetHeight;\n                if (dynamicHeight) {\n                    listHeight = 0;\n                    vl.heights = [];\n                    for (var i = 0; i < items.length; i++) {\n                        var itemHeight = vl.params.height(items[i]);\n                        listHeight += itemHeight;\n                        vl.heights.push(itemHeight);\n                    }\n                }\n                else {\n                    listHeight = Math.ceil(items.length /  vl.params.cols) * vl.params.height;\n                    rowsPerScreen = Math.ceil(pageHeight / vl.params.height);\n                    rowsBefore = vl.params.rowsBefore || rowsPerScreen * 2;\n                    rowsAfter = vl.params.rowsAfter || rowsPerScreen;\n                    rowsToRender = (rowsPerScreen + rowsBefore + rowsAfter);\n                    maxBufferHeight = rowsBefore / 2 * vl.params.height;\n                }\n        \n                if (updatableScroll) {\n                    vl.ul.css({height: listHeight + 'px'});\n                }\n            };\n        \n            // Render items\n            vl.render = function (force, forceScrollTop) {\n                if (force) vl.lastRepaintY = null;\n        \n                var scrollTop = -(vl.listBlock[0].getBoundingClientRect().top - vl.pageContent[0].getBoundingClientRect().top);\n        \n                if (typeof forceScrollTop !== 'undefined') scrollTop = forceScrollTop;\n        \n                if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > maxBufferHeight || (!updatableScroll && (vl.pageContent[0].scrollTop + pageHeight >= vl.pageContent[0].scrollHeight))) {\n                    vl.lastRepaintY = scrollTop;\n                }\n                else {\n                    return;\n                }\n        \n                var items = vl.filteredItems || vl.items, \n                    fromIndex, toIndex, heightBeforeFirstItem = 0, heightBeforeLastItem = 0;\n                if (dynamicHeight) {\n                    var itemTop = 0, j, itemHeight; \n                    maxBufferHeight = pageHeight;\n        \n                    for (j = 0; j < vl.heights.length; j++) {\n                        itemHeight = vl.heights[j];\n                        if (typeof fromIndex === 'undefined') {\n                            if (itemTop + itemHeight >= scrollTop - pageHeight * 2 * vl.params.dynamicHeightBufferSize) fromIndex = j;\n                            else heightBeforeFirstItem += itemHeight;\n                        }\n        \n                        if (typeof toIndex === 'undefined') {\n                            if (itemTop + itemHeight >= scrollTop + pageHeight * 2 * vl.params.dynamicHeightBufferSize || j === vl.heights.length - 1) toIndex = j + 1;\n                            heightBeforeLastItem += itemHeight;\n                        }\n                        itemTop += itemHeight;\n                    }\n                    toIndex = Math.min(toIndex, items.length);\n                }\n                else {\n                    fromIndex = (parseInt(scrollTop / vl.params.height) - rowsBefore) * vl.params.cols;\n                    if (fromIndex < 0) {\n                        fromIndex = 0;\n                    }\n                    toIndex = Math.min(fromIndex + rowsToRender * vl.params.cols, items.length);\n                }\n        \n                var topPosition;\n                vl.reachEnd = false;\n                for (var i = fromIndex; i < toIndex; i++) {\n                    var item, index;\n                    // Define real item index\n                    index = vl.items.indexOf(items[i]);\n        \n                    if (i === fromIndex) vl.currentFromIndex = index;\n                    if (i === toIndex - 1) vl.currentToIndex = index;\n                    if (index === vl.items.length - 1) vl.reachEnd = true;\n        \n                    // Find items\n                    if (vl.domCache[index]) {\n                        item = vl.domCache[index];\n                    }\n                    else {\n                        if (vl.template) {\n                            vl.tempDomElement.innerHTML = vl.template(items[i], {index: index}).trim();\n                        }\n                        else if (vl.params.renderItem) {\n                            vl.tempDomElement.innerHTML = vl.params.renderItem(index, items[i]).trim();\n                        }\n                        else {\n                            vl.tempDomElement.innerHTML = items[i].trim();\n                        }\n                        item = vl.tempDomElement.childNodes[0];\n                        if (vl.params.cache) vl.domCache[index] = item;\n                    }\n                    item.f7VirtualListIndex = index;\n        \n                    // Set item top position\n                    if (i === fromIndex) {\n                        if (dynamicHeight) {\n                            topPosition = heightBeforeFirstItem;\n                        }\n                        else {\n                            topPosition = (i * vl.params.height / vl.params.cols);\n                        }\n                    }\n                    item.style.top = topPosition + 'px';\n        \n                    // Before item insert\n                    if (vl.params.onItemBeforeInsert) vl.params.onItemBeforeInsert(vl, item);\n        \n                    // Append item to fragment\n                    vl.fragment.appendChild(item);\n        \n        \n                }\n        \n                // Update list height with not updatable scroll\n                if (!updatableScroll) {\n                    if (dynamicHeight) {\n                        vl.ul[0].style.height = heightBeforeLastItem + 'px';\n                    }\n                    else {\n                        vl.ul[0].style.height = i * vl.params.height / vl.params.cols + 'px';\n                    }\n                }\n        \n        \n                // Update list html\n                if (vl.params.onBeforeClear) vl.params.onBeforeClear(vl, vl.fragment);\n                vl.ul[0].innerHTML = '';\n        \n                if (vl.params.onItemsBeforeInsert) vl.params.onItemsBeforeInsert(vl, vl.fragment);\n                vl.ul[0].appendChild(vl.fragment);\n                if (vl.params.onItemsAfterInsert) vl.params.onItemsAfterInsert(vl, vl.fragment);\n        \n                if (typeof forceScrollTop !== 'undefined' && force) {\n                    vl.pageContent.scrollTop(forceScrollTop, 0);\n                }\n            };\n        \n            vl.scrollToItem = function (index) {\n                if (index > vl.items.length) return false;\n        \n                var itemTop = 0, listTop;\n                if (dynamicHeight) {\n                    for (var i = 0; i < index; i++) {\n                        itemTop += vl.heights[i];\n                    }\n                }\n                else {\n                    itemTop = index * vl.params.height;\n                }\n                listTop = vl.listBlock[0].offsetTop;\n                vl.render(true, listTop + itemTop - parseInt(vl.pageContent.css('padding-top'), 10));\n                return true;\n            };\n        \n            // Handle scroll event\n            vl.handleScroll = function (e) {\n                vl.render();\n            };\n            // Handle resize event\n            vl._isVisible = function (el) {\n                return !!( el.offsetWidth || el.offsetHeight || el.getClientRects().length );\n            };\n            vl.handleResize = function (e) {\n                if (vl._isVisible(vl.listBlock[0])) {\n                    vl.setListSize();\n                    vl.render(true);\n                }\n            };\n        \n            vl.attachEvents = function (detach) {\n                var action = detach ? 'off' : 'on';\n                vl.pageContent[action]('scroll', vl.handleScroll);\n                vl.listBlock.parents('.tab').eq(0)[action]('show', vl.handleResize);\n                $(window)[action]('resize', vl.handleResize);\n            };\n        \n            // Init Virtual List\n            vl.init = function () {\n                vl.attachEvents();\n                vl.setListSize();\n                vl.render();\n            };\n        \n            // Append\n            vl.appendItems = function (items) {\n                for (var i = 0; i < items.length; i++) {\n                    vl.items.push(items[i]);\n                }\n                vl.update();\n            };\n            vl.appendItem = function (item) {\n                vl.appendItems([item]);\n            };\n            // Replace\n            vl.replaceAllItems = function (items) {\n                vl.items = items;\n                delete vl.filteredItems;\n                vl.domCache = {};\n                vl.update();\n            };\n            vl.replaceItem = function (index, item) {\n                vl.items[index] = item;\n                if (vl.params.cache) delete vl.domCache[index];\n                vl.update();\n            };\n            // Prepend\n            vl.prependItems = function (items) {\n                for (var i = items.length - 1; i >= 0; i--) {\n                    vl.items.unshift(items[i]);\n                }\n                if (vl.params.cache) {\n                    var newCache = {};\n                    for (var cached in vl.domCache) {\n                        newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];\n                    }\n                    vl.domCache = newCache;\n                }\n                vl.update();\n            };\n            vl.prependItem = function (item) {\n                vl.prependItems([item]);\n            };\n        \n            // Move\n            vl.moveItem = function (oldIndex, newIndex) {\n                if (oldIndex === newIndex) return;\n                // remove item from array\n                var item = vl.items.splice(oldIndex, 1)[0];\n                if (newIndex >= vl.items.length) {\n                    // Add item to the end\n                    vl.items.push(item);\n                    newIndex = vl.items.length - 1;\n                }\n                else {\n                    // Add item to new index\n                    vl.items.splice(newIndex, 0, item);\n                }\n                // Update cache\n                if (vl.params.cache) {\n                    var newCache = {};\n                    for (var cached in vl.domCache) {\n                        var cachedIndex = parseInt(cached, 10);\n                        var leftIndex = oldIndex < newIndex ? oldIndex : newIndex;\n                        var rightIndex = oldIndex < newIndex ? newIndex : oldIndex;\n                        var indexShift = oldIndex < newIndex ? -1 : 1;\n                        if (cachedIndex < leftIndex || cachedIndex > rightIndex) newCache[cachedIndex] = vl.domCache[cachedIndex];\n                        if (cachedIndex === leftIndex) newCache[rightIndex] = vl.domCache[cachedIndex];\n                        if (cachedIndex > leftIndex && cachedIndex <= rightIndex) newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex];\n                    }\n                    vl.domCache = newCache;\n                }\n                vl.update();\n            };\n            // Insert before\n            vl.insertItemBefore = function (index, item) {\n                if (index === 0) {\n                    vl.prependItem(item);\n                    return;\n                }\n                if (index >= vl.items.length) {\n                    vl.appendItem(item);\n                    return;\n                }\n                vl.items.splice(index, 0, item);\n                // Update cache\n                if (vl.params.cache) {\n                    var newCache = {};\n                    for (var cached in vl.domCache) {\n                        var cachedIndex = parseInt(cached, 10);\n                        if (cachedIndex >= index) {\n                            newCache[cachedIndex + 1] = vl.domCache[cachedIndex];\n                        }\n                    }\n                    vl.domCache = newCache;\n                }\n                vl.update();\n            };\n            // Delete\n            vl.deleteItems = function (indexes) {\n                var prevIndex, indexShift = 0;\n                for (var i = 0; i < indexes.length; i++) {\n                    var index = indexes[i];\n                    if (typeof prevIndex !== 'undefined') {\n                        if (index > prevIndex) {\n                            indexShift = -i;\n                        }\n                    }\n                    index = index + indexShift;\n                    prevIndex = indexes[i];\n                    // Delete item\n                    var deletedItem = vl.items.splice(index, 1)[0];\n        \n                    // Delete from filtered\n                    if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {\n                        vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);\n                    }\n                    // Update cache\n                    if (vl.params.cache) {\n                        var newCache = {};\n                        for (var cached in vl.domCache) {\n                            var cachedIndex = parseInt(cached, 10);\n                            if (cachedIndex === index) {\n                                delete vl.domCache[index];\n                            }\n                            else if (parseInt(cached, 10) > index) {\n                                newCache[cachedIndex - 1] = vl.domCache[cached];\n                            }\n                            else {\n                                newCache[cachedIndex] = vl.domCache[cached];   \n                            }\n                        }\n                        vl.domCache = newCache;\n                    }\n                }\n                vl.update();\n            };\n            vl.deleteAllItems = function () {\n                vl.items = [];\n                delete vl.filteredItems;\n                if (vl.params.cache) vl.domCache = {};\n                vl.update();\n            };\n            vl.deleteItem = function (index) {\n                vl.deleteItems([index]);\n            };\n        \n            // Clear cache\n            vl.clearCache = function () {\n                vl.domCache = {};\n            };\n        \n            // Update Virtual List\n            vl.update = function () {\n                vl.setListSize();\n                vl.render(true);\n            };\n        \n            // Destroy\n            vl.destroy = function () {\n                vl.attachEvents(true);\n                delete vl.items;\n                delete vl.domCache;\n            };\n        \n            // Init Virtual List\n            vl.init();\n        \n            // Store vl in container\n            vl.listBlock[0].f7VirtualList = vl;\n            return vl;\n        };\n        \n        // App Method\n        app.virtualList = function (listBlock, params) {\n            return new VirtualList(listBlock, params);\n        };\n        \n        app.reinitVirtualList = function (pageContainer) {\n            var page = $(pageContainer);\n            var vlists = page.find('.virtual-list');\n            if (vlists.length === 0) return;\n            for (var i = 0; i < vlists.length; i++) {\n                var vlistInstance = vlists[i].f7VirtualList;\n                if (vlistInstance) {\n                    vlistInstance.update();\n                }\n            }\n        };\n\n        /*======================================================\n        ************   Pull To Refresh   ************\n        ======================================================*/\n        app.initPullToRefresh = function (pageContainer) {\n            var eventsTarget = $(pageContainer);\n            if (!eventsTarget.hasClass('pull-to-refresh-content')) {\n                eventsTarget = eventsTarget.find('.pull-to-refresh-content');\n            }\n            if (!eventsTarget || eventsTarget.length === 0) return;\n        \n            var touchId, isTouched, isMoved, touchesStart = {}, isScrolling, touchesDiff, touchStartTime, container, refresh = false, useTranslate = false, startTranslate = 0, translate, scrollTop, wasScrolled, layer, triggerDistance, dynamicTriggerDistance, pullStarted;\n            var page = eventsTarget.hasClass('page') ? eventsTarget : eventsTarget.parents('.page');\n            var hasNavbar = false;\n            if (page.find('.navbar').length > 0 || page.parents('.navbar-fixed, .navbar-through').length > 0 || page.hasClass('navbar-fixed') || page.hasClass('navbar-through')) hasNavbar = true;\n            if (page.hasClass('no-navbar')) hasNavbar = false;\n            if (!hasNavbar) eventsTarget.addClass('pull-to-refresh-no-navbar');\n        \n            container = eventsTarget;\n        \n            // Define trigger distance\n            if (container.attr('data-ptr-distance')) {\n                dynamicTriggerDistance = true;\n            }\n            else {\n                triggerDistance = 44;   \n            }\n            \n            function handleTouchStart(e) {\n                if (isTouched) {\n                    if (app.device.os === 'android') {\n                        if ('targetTouches' in e && e.targetTouches.length > 1) return;\n                    }\n                    else return;\n                }\n                \n                /*jshint validthis:true */\n                container = $(this);\n                if (container.hasClass('refreshing')) {\n                    return;\n                }\n                \n                isMoved = false;\n                pullStarted = false;\n                isTouched = true;\n                isScrolling = undefined;\n                wasScrolled = undefined;\n                if (e.type === 'touchstart') touchId = e.targetTouches[0].identifier;\n                touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n                touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                touchStartTime = (new Date()).getTime();\n                \n            }\n            \n            function handleTouchMove(e) {\n                if (!isTouched) return;\n                var pageX, pageY, touch;\n                if (e.type === 'touchmove') {\n                    if (touchId && e.touches) {\n                        for (var i = 0; i < e.touches.length; i++) {\n                            if (e.touches[i].identifier === touchId) {\n                                touch = e.touches[i];\n                            }\n                        }\n                    }\n                    if (!touch) touch = e.targetTouches[0];\n                    pageX = touch.pageX;\n                    pageY = touch.pageY;\n                }\n                else {\n                    pageX = e.pageX;\n                    pageY = e.pageY;\n                }\n                if (!pageX || !pageY) return;\n                    \n        \n                if (typeof isScrolling === 'undefined') {\n                    isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));\n                }\n                if (!isScrolling) {\n                    isTouched = false;\n                    return;\n                }\n        \n                scrollTop = container[0].scrollTop;\n                if (typeof wasScrolled === 'undefined' && scrollTop !== 0) wasScrolled = true; \n        \n                if (!isMoved) {\n                    /*jshint validthis:true */\n                    container.removeClass('transitioning');\n                    if (scrollTop > container[0].offsetHeight) {\n                        isTouched = false;\n                        return;\n                    }\n                    if (dynamicTriggerDistance) {\n                        triggerDistance = container.attr('data-ptr-distance');\n                        if (triggerDistance.indexOf('%') >= 0) triggerDistance = container[0].offsetHeight * parseInt(triggerDistance, 10) / 100;\n                    }\n                    startTranslate = container.hasClass('refreshing') ? triggerDistance : 0;\n                    if (container[0].scrollHeight === container[0].offsetHeight || app.device.os !== 'ios') {\n                        useTranslate = true;\n                    }\n                    else {\n                        useTranslate = false;\n                    }\n                }\n                isMoved = true;\n                touchesDiff = pageY - touchesStart.y;\n                \n                if (touchesDiff > 0 && scrollTop <= 0 || scrollTop < 0) {\n                    // iOS 8 fix\n                    if (app.device.os === 'ios' && parseInt(app.device.osVersion.split('.')[0], 10) > 7 && scrollTop === 0 && !wasScrolled) useTranslate = true;\n        \n                    if (useTranslate) {\n                        e.preventDefault();\n                        translate = (Math.pow(touchesDiff, 0.85) + startTranslate);\n                        container.transform('translate3d(0,' + translate + 'px,0)');\n                    }\n                    if ((useTranslate && Math.pow(touchesDiff, 0.85) > triggerDistance) || (!useTranslate && touchesDiff >= triggerDistance * 2)) {\n                        refresh = true;\n                        container.addClass('pull-up').removeClass('pull-down');\n                    }\n                    else {\n                        refresh = false;\n                        container.removeClass('pull-up').addClass('pull-down');\n                    }\n                    if (!pullStarted) {\n                        container.trigger('pullstart');\n                        pullStarted = true;\n                    }\n                    container.trigger('pullmove', {\n                        event: e,\n                        scrollTop: scrollTop,\n                        translate: translate,\n                        touchesDiff: touchesDiff\n                    });\n                }\n                else {\n                    pullStarted = false;\n                    container.removeClass('pull-up pull-down');\n                    refresh = false;\n                    return;\n                }\n            }\n            function handleTouchEnd(e) {\n                if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {\n                    if (e.changedTouches[0].identifier !== touchId) return;\n                }\n                if (!isTouched || !isMoved) {\n                    isTouched = false;\n                    isMoved = false;\n                    return;\n                }\n                if (translate) {\n                    container.addClass('transitioning');\n                    translate = 0;\n                }\n                container.transform('');\n                if (refresh) {\n                    container.addClass('refreshing');\n                    container.trigger('refresh', {\n                        done: function () {\n                            app.pullToRefreshDone(container);\n                        }\n                    });\n                }\n                else {\n                    container.removeClass('pull-down');\n                }\n                isTouched = false;\n                isMoved = false;\n                if (pullStarted) container.trigger('pullend');\n            }\n        \n            // Attach Events\n            var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? {passive: true, capture: false} : false;\n            eventsTarget.on(app.touchEvents.start, handleTouchStart, passiveListener);\n            eventsTarget.on(app.touchEvents.move, handleTouchMove);\n            eventsTarget.on(app.touchEvents.end, handleTouchEnd, passiveListener);\n        \n            // Detach Events on page remove\n            if (page.length === 0) return;\n            function destroyPullToRefresh() {\n                eventsTarget.off(app.touchEvents.start, handleTouchStart);\n                eventsTarget.off(app.touchEvents.move, handleTouchMove);\n                eventsTarget.off(app.touchEvents.end, handleTouchEnd);\n            }\n            eventsTarget[0].f7DestroyPullToRefresh = destroyPullToRefresh;\n            function detachEvents() {\n                destroyPullToRefresh();\n                page.off('pageBeforeRemove', detachEvents);\n            }\n            page.on('pageBeforeRemove', detachEvents);\n        \n        };\n        \n        app.pullToRefreshDone = function (container) {\n            container = $(container);\n            if (container.length === 0) container = $('.pull-to-refresh-content.refreshing');\n            container.removeClass('refreshing').addClass('transitioning');\n            container.transitionEnd(function () {\n                container.removeClass('transitioning pull-up pull-down');\n                container.trigger('refreshdone');\n            });\n        };\n        app.pullToRefreshTrigger = function (container) {\n            container = $(container);\n            if (container.length === 0) container = $('.pull-to-refresh-content');\n            if (container.hasClass('refreshing')) return;\n            container.addClass('transitioning refreshing');\n            container.trigger('refresh', {\n                done: function () {\n                    app.pullToRefreshDone(container);\n                }\n            });\n        };\n        \n        app.destroyPullToRefresh = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var pullToRefreshContent = pageContainer.hasClass('pull-to-refresh-content') ? pageContainer : pageContainer.find('.pull-to-refresh-content');\n            if (pullToRefreshContent.length === 0) return;\n            if (pullToRefreshContent[0].f7DestroyPullToRefresh) pullToRefreshContent[0].f7DestroyPullToRefresh();\n        };\n        \n\n        /* ===============================================================================\n        ************   Infinite Scroll   ************\n        =============================================================================== */\n        function handleInfiniteScroll() {\n            /*jshint validthis:true */\n            var inf = $(this);\n            var scrollTop = inf[0].scrollTop;\n            var scrollHeight = inf[0].scrollHeight;\n            var height = inf[0].offsetHeight;\n            var distance = inf[0].getAttribute('data-distance');\n            var virtualListContainer = inf.find('.virtual-list');\n            var virtualList;\n            var onTop = inf.hasClass('infinite-scroll-top');\n            if (!distance) distance = 50;\n            if (typeof distance === 'string' && distance.indexOf('%') >= 0) {\n                distance = parseInt(distance, 10) / 100 * height;\n            }\n            if (distance > height) distance = height;\n            if (onTop) {\n                if (scrollTop < distance) {\n                    inf.trigger('infinite');\n                }\n            }\n            else {\n                if (scrollTop + height >= scrollHeight - distance) {\n                    if (virtualListContainer.length > 0) {\n                        virtualList = virtualListContainer[0].f7VirtualList;\n                        if (virtualList && !virtualList.reachEnd) return;\n                    }\n                    inf.trigger('infinite');\n                }\n            }\n        \n        }\n        app.attachInfiniteScroll = function (infiniteContent) {\n            $(infiniteContent).on('scroll', handleInfiniteScroll);\n        };\n        app.detachInfiniteScroll = function (infiniteContent) {\n            $(infiniteContent).off('scroll', handleInfiniteScroll);\n        };\n        \n        app.initPageInfiniteScroll = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var infiniteContent = pageContainer.find('.infinite-scroll');\n            if (infiniteContent.length === 0) return;\n            app.attachInfiniteScroll(infiniteContent);\n            function detachEvents() {\n                app.detachInfiniteScroll(infiniteContent);\n                pageContainer.off('pageBeforeRemove', detachEvents);\n            }\n            pageContainer.on('pageBeforeRemove', detachEvents);\n        };\n\n        /*=============================================================\n        ************   Hide/show Toolbar/Navbar on scroll   ************\n        =============================================================*/\n        app.initPageScrollToolbars = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var scrollContent = pageContainer.find('.page-content');\n            if (scrollContent.length === 0) return;\n            var hideNavbar = (app.params.hideNavbarOnPageScroll || scrollContent.hasClass('hide-navbar-on-scroll') || scrollContent.hasClass('hide-bars-on-scroll')) && !(scrollContent.hasClass('keep-navbar-on-scroll') || scrollContent.hasClass('keep-bars-on-scroll'));\n            var hideToolbar = (app.params.hideToolbarOnPageScroll || scrollContent.hasClass('hide-toolbar-on-scroll') || scrollContent.hasClass('hide-bars-on-scroll')) && !(scrollContent.hasClass('keep-toolbar-on-scroll') || scrollContent.hasClass('keep-bars-on-scroll'));\n            var hideTabbar = (app.params.hideTabbarOnPageScroll || scrollContent.hasClass('hide-tabbar-on-scroll')) && !(scrollContent.hasClass('keep-tabbar-on-scroll'));\n        \n            if (!(hideNavbar || hideToolbar || hideTabbar)) return;\n            \n            var viewContainer = scrollContent.parents('.' + app.params.viewClass);\n            if (viewContainer.length === 0) return;\n        \n            var navbar = viewContainer.find('.navbar'), \n                toolbar = viewContainer.find('.toolbar'), \n                tabbar;\n            if (hideTabbar) {\n                tabbar = viewContainer.find('.tabbar');\n                if (tabbar.length === 0) tabbar = viewContainer.parents('.' + app.params.viewsClass).find('.tabbar');\n            }\n        \n            var hasNavbar = navbar.length > 0,\n                hasToolbar = toolbar.length > 0,\n                hasTabbar = tabbar && tabbar.length > 0;\n        \n            var previousScroll, currentScroll;\n                previousScroll = currentScroll = scrollContent[0].scrollTop;\n        \n            var scrollHeight, offsetHeight, reachEnd, action, navbarHidden, toolbarHidden, tabbarHidden;\n        \n            var toolbarHeight = (hasToolbar && hideToolbar) ? toolbar[0].offsetHeight : 0;\n            var tabbarHeight = (hasTabbar && hideTabbar) ? tabbar[0].offsetHeight : 0;\n            var bottomBarHeight = tabbarHeight || toolbarHeight;\n        \n            function handleScroll(e) {\n                if (pageContainer.hasClass('page-on-left')) return;\n                currentScroll = scrollContent[0].scrollTop;\n                scrollHeight = scrollContent[0].scrollHeight;\n                offsetHeight = scrollContent[0].offsetHeight;\n                reachEnd =  currentScroll + offsetHeight >= scrollHeight - bottomBarHeight;\n                navbarHidden = navbar.hasClass('navbar-hidden');\n                toolbarHidden = toolbar.hasClass('toolbar-hidden');\n                tabbarHidden = tabbar && tabbar.hasClass('toolbar-hidden');\n        \n                if (reachEnd) {\n                    if (app.params.showBarsOnPageScrollEnd) {\n                        action = 'show';\n                    }\n                }\n                else if (previousScroll > currentScroll) {\n                    if (app.params.showBarsOnPageScrollTop || currentScroll <= 44) {\n                        action = 'show';\n                    }\n                    else {\n                        action = 'hide';\n                    }\n                }\n                else {\n                    if (currentScroll > 44) {\n                        action = 'hide';\n                    }\n                    else {\n                        action = 'show';\n                    }\n                }\n        \n                if (action === 'show') {\n                    if (hasNavbar && hideNavbar && navbarHidden) {\n                        app.showNavbar(navbar);\n                        pageContainer.removeClass('no-navbar-by-scroll'); \n                        navbarHidden = false;\n                    }\n                    if (hasToolbar && hideToolbar && toolbarHidden) {\n                        app.showToolbar(toolbar);\n                        pageContainer.removeClass('no-toolbar-by-scroll'); \n                        toolbarHidden = false;\n                    }\n                    if (hasTabbar && hideTabbar && tabbarHidden) {\n                        app.showToolbar(tabbar);\n                        pageContainer.removeClass('no-tabbar-by-scroll'); \n                        tabbarHidden = false;\n                    }\n                }\n                else {\n                    if (hasNavbar && hideNavbar && !navbarHidden) {\n                        app.hideNavbar(navbar);\n                        pageContainer.addClass('no-navbar-by-scroll'); \n                        navbarHidden = true;\n                    }\n                    if (hasToolbar && hideToolbar && !toolbarHidden) {\n                        app.hideToolbar(toolbar);\n                        pageContainer.addClass('no-toolbar-by-scroll'); \n                        toolbarHidden = true;\n                    }\n                    if (hasTabbar && hideTabbar && !tabbarHidden) {\n                        app.hideToolbar(tabbar);\n                        pageContainer.addClass('no-tabbar-by-scroll'); \n                        tabbarHidden = true;\n                    }\n                }\n                    \n                previousScroll = currentScroll;\n            }\n            scrollContent.on('scroll', handleScroll);\n            scrollContent[0].f7ScrollToolbarsHandler = handleScroll;\n        };\n        app.destroyScrollToolbars = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var scrollContent = pageContainer.find('.page-content');\n            if (scrollContent.length === 0) return;\n            var handler = scrollContent[0].f7ScrollToolbarsHandler;\n            if (!handler) return;\n            scrollContent.off('scroll', scrollContent[0].f7ScrollToolbarsHandler);\n        };\n\n        /*======================================================\n        ************   Material Tabbar   ************\n        ======================================================*/\n        app.materialTabbarSetHighlight = function (tabbar, activeLink) {\n            tabbar = $(tabbar);\n            activeLink = activeLink || tabbar.find('.tab-link.active');\n        \n            var tabLinkWidth, highlightTranslate;\n            if (tabbar.hasClass('tabbar-scrollable')) {\n                tabLinkWidth = activeLink[0].offsetWidth + 'px';\n                highlightTranslate = (app.rtl ? - activeLink[0].offsetLeft: activeLink[0].offsetLeft) + 'px';\n            }\n            else {\n                tabLinkWidth = 1 / tabbar.find('.tab-link').length * 100 + '%';\n                highlightTranslate = (app.rtl ? - activeLink.index(): activeLink.index()) * 100 + '%';\n            }\n        \n            tabbar.find('.tab-link-highlight')\n                .css({width: tabLinkWidth})\n                .transform('translate3d(' + highlightTranslate + ',0,0)');\n        };\n        app.initPageMaterialTabbar = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var tabbar = $(pageContainer).find('.tabbar');\n        \n            function tabbarSetHighlight() {\n                app.materialTabbarSetHighlight(tabbar);\n            }\n            if (tabbar.length > 0) {\n                if (tabbar.find('.tab-link-highlight').length === 0) {\n                    tabbar.find('.toolbar-inner').append('<span class=\"tab-link-highlight\"></span>');\n                }\n        \n                tabbarSetHighlight();\n                $(window).on('resize', tabbarSetHighlight);\n                pageContainer.once('pageBeforeRemove', function () {\n                    $(window).off('resize', tabbarSetHighlight);\n                });\n            }\n        };\n\n        /* ===============================================================================\n        ************   Tabs   ************\n        =============================================================================== */\n        app.showTab = function (tab, tabLink, force) {\n            var newTab = $(tab);\n            if (arguments.length === 2) {\n                if (typeof tabLink === 'boolean') {\n                    force = tabLink;\n                }\n            }\n            if (newTab.length === 0) return false;\n            if (newTab.hasClass('active')) {\n                if (force) newTab.trigger('show');\n                return false;\n            }\n            var tabs = newTab.parent('.tabs');\n            if (tabs.length === 0) return false;\n        \n            // Return swipeouts in hidden tabs\n            app.allowSwipeout = true;\n        \n            // Animated tabs\n            var isAnimatedTabs = tabs.parent().hasClass('tabs-animated-wrap');\n            if (isAnimatedTabs) {\n                var tabTranslate = (app.rtl ? newTab.index() : -newTab.index()) * 100;\n                tabs.transform('translate3d(' + tabTranslate + '%,0,0)');\n            }\n        \n            // Swipeable tabs\n            var isSwipeableTabs = tabs.parent().hasClass('tabs-swipeable-wrap'), swiper;\n            if (isSwipeableTabs) {\n                swiper = tabs.parent()[0].swiper;\n                if (swiper.activeIndex !== newTab.index()) swiper.slideTo(newTab.index(), undefined, false);\n            }\n        \n            // Remove active class from old tabs\n            var oldTab = tabs.children('.tab.active').removeClass('active').trigger('hide');\n            // Add active class to new tab\n            newTab.addClass('active');\n            // Trigger 'show' event on new tab\n            newTab.trigger('show');\n        \n            // Update navbars in new tab\n            if (!isAnimatedTabs && !isSwipeableTabs && newTab.find('.navbar').length > 0) {\n                // Find tab's view\n                var viewContainer;\n                if (newTab.hasClass(app.params.viewClass)) viewContainer = newTab[0];\n                else viewContainer = newTab.parents('.' + app.params.viewClass)[0];\n                app.sizeNavbars(viewContainer);\n            }\n        \n            // Find related link for new tab\n            if (tabLink) tabLink = $(tabLink);\n            else {\n                // Search by id\n                if (typeof tab === 'string') tabLink = $('.tab-link[href=\"' + tab + '\"]');\n                else tabLink = $('.tab-link[href=\"#' + newTab.attr('id') + '\"]');\n                // Search by data-tab\n                if (!tabLink || tabLink && tabLink.length === 0) {\n                    $('[data-tab]').each(function () {\n                        if (newTab.is($(this).attr('data-tab'))) tabLink = $(this);\n                    });\n                }\n            }\n            if (tabLink.length === 0) return;\n        \n            // Find related link for old tab\n            var oldTabLink;\n            if (oldTab && oldTab.length > 0) {\n                // Search by id\n                var oldTabId = oldTab.attr('id');\n                if (oldTabId) oldTabLink = $('.tab-link[href=\"#' + oldTabId + '\"]');\n                // Search by data-tab\n                if (!oldTabLink || oldTabLink && oldTabLink.length === 0) {\n                    $('[data-tab]').each(function () {\n                        if (oldTab.is($(this).attr('data-tab'))) oldTabLink = $(this);\n                    });\n                }\n            }\n        \n            // Update links' classes\n            if (tabLink && tabLink.length > 0) {\n                tabLink.addClass('active');\n                // Material Highlight\n                if (app.params.material) {\n                    var tabbar = tabLink.parents('.tabbar');\n                    if (tabbar.length > 0) {\n                        if (tabbar.find('.tab-link-highlight').length === 0) {\n                            tabbar.find('.toolbar-inner').append('<span class=\"tab-link-highlight\"></span>');\n                        }\n                        app.materialTabbarSetHighlight(tabbar, tabLink);\n                    }\n                }\n            }\n            if (oldTabLink && oldTabLink.length > 0) oldTabLink.removeClass('active');\n        \n            return true;\n        };\n\n        /*===============================================================================\n        ************   Accordion   ************\n        ===============================================================================*/\n        app.accordionToggle = function (item) {\n            item = $(item);\n            if (item.length === 0) return;\n            if (item.hasClass('accordion-item-expanded')) app.accordionClose(item);\n            else app.accordionOpen(item);\n        };\n        app.accordionOpen = function (item) {\n            item = $(item);\n            var list = item.parents('.accordion-list').eq(0);\n            var content = item.children('.accordion-item-content');\n            if (content.length === 0) content = item.find('.accordion-item-content');\n            var expandedItem = list.length > 0 && item.parent().children('.accordion-item-expanded');\n            if (expandedItem.length > 0) {\n                app.accordionClose(expandedItem);\n            }\n            content.css('height', content[0].scrollHeight + 'px').transitionEnd(function () {\n                if (item.hasClass('accordion-item-expanded')) {\n                    content.transition(0);\n                    content.css('height', 'auto');\n                    var clientLeft = content[0].clientLeft;\n                    content.transition('');\n                    item.trigger('opened');\n                }\n                else {\n                    content.css('height', '');\n                    item.trigger('closed');\n                }\n            });\n            item.trigger('open');\n            item.addClass('accordion-item-expanded');\n        };\n        app.accordionClose = function (item) {\n            item = $(item);\n            var content = item.children('.accordion-item-content');\n            if (content.length === 0) content = item.find('.accordion-item-content');\n            item.removeClass('accordion-item-expanded');\n            content.transition(0);\n            content.css('height', content[0].scrollHeight + 'px');\n            // Relayout\n            var clientLeft = content[0].clientLeft;\n            // Close\n            content.transition('');\n            content.css('height', '').transitionEnd(function () {\n                if (item.hasClass('accordion-item-expanded')) {\n                    content.transition(0);\n                    content.css('height', 'auto');\n                    var clientLeft = content[0].clientLeft;\n                    content.transition('');\n                    item.trigger('opened');\n                }\n                else {\n                    content.css('height', '');\n                    item.trigger('closed');\n                }\n            });\n            item.trigger('close');\n        };\n\n        /*===============================================================================\n        ************   Fast Clicks   ************\n        ************   Inspired by https://github.com/ftlabs/fastclick   ************\n        ===============================================================================*/\n        app.initFastClicks = function () {\n            if (app.params.activeState) {\n                $('html').addClass('watch-active-state');\n            }\n            if (app.device.ios && app.device.webView) {\n                // Strange hack required for iOS 8 webview to work on inputs\n                window.addEventListener('touchstart', function () {});\n            }\n        \n            var touchStartX, touchStartY, touchStartTime, targetElement, trackClick, activeSelection, scrollParent, lastClickTime, isMoved, tapHoldFired, tapHoldTimeout;\n            var activableElement, activeTimeout, needsFastClick, needsFastClickTimeOut;\n            var rippleWave, rippleTarget, rippleTransform, rippleTimeout;\n            function findActivableElement(el) {\n                var target = $(el);\n                var parents = target.parents(app.params.activeStateElements);\n                var activable;\n                if (target.is(app.params.activeStateElements)) {\n                    activable = target;\n                }\n                if (parents.length > 0) {\n                    activable = activable ? activable.add(parents) : parents;\n                }\n                return activable ? activable : target;\n            }\n            function isInsideScrollableView(el) {\n                var pageContent = el.parents('.page-content, .panel');\n        \n                if (pageContent.length === 0) {\n                    return false;\n                }\n        \n                // This event handler covers the \"tap to stop scrolling\".\n                if (pageContent.prop('scrollHandlerSet') !== 'yes') {\n                    pageContent.on('scroll', function() {\n                      clearTimeout(activeTimeout);\n                      clearTimeout(rippleTimeout);\n                    });\n                    pageContent.prop('scrollHandlerSet', 'yes');\n                }\n        \n                return true;\n            }\n            function addActive() {\n                if (!activableElement) return;\n                activableElement.addClass('active-state');\n            }\n            function removeActive(el) {\n                if (!activableElement) return;\n                activableElement.removeClass('active-state');\n                activableElement = null;\n            }\n            function isFormElement(el) {\n                var nodes = ('input select textarea label').split(' ');\n                if (el.nodeName && nodes.indexOf(el.nodeName.toLowerCase()) >= 0) return true;\n                return false;\n            }\n            function androidNeedsBlur(el) {\n                var noBlur = ('button input textarea select').split(' ');\n                if (document.activeElement && el !== document.activeElement && document.activeElement !== document.body) {\n                    if (noBlur.indexOf(el.nodeName.toLowerCase()) >= 0) {\n                        return false;\n                    }\n                    else {\n                        return true;\n                    }\n                }\n                else {\n                    return false;\n                }\n            }\n            function targetNeedsFastClick(el) {\n                var $el = $(el);\n                if (el.nodeName.toLowerCase() === 'input' && el.type === 'file') return false;\n                if (el.nodeName.toLowerCase() === 'select' && app.device.android) return false;\n                if ($el.hasClass('no-fastclick') || $el.parents('.no-fastclick').length > 0) return false;\n                if (app.params.fastClicksExclude && $el.is(app.params.fastClicksExclude)) return false;\n                return true;\n            }\n            function targetNeedsFocus(el) {\n                if (document.activeElement === el) {\n                    return false;\n                }\n                var tag = el.nodeName.toLowerCase();\n                var skipInputs = ('button checkbox file image radio submit').split(' ');\n                if (el.disabled || el.readOnly) return false;\n                if (tag === 'textarea') return true;\n                if (tag === 'select') {\n                    if (app.device.android) return false;\n                    else return true;\n                }\n                if (tag === 'input' && skipInputs.indexOf(el.type) < 0) return true;\n            }\n            function targetNeedsPrevent(el) {\n                el = $(el);\n                var prevent = true;\n                if (el.is('label') || el.parents('label').length > 0) {\n                    if (app.device.android) {\n                        prevent = false;\n                    }\n                    else if (app.device.ios && el.is('input')) {\n                        prevent = true;\n                    }\n                    else prevent = false;\n                }\n                return prevent;\n            }\n        \n            // Mouse Handlers\n            function handleMouseDown (e) {\n                findActivableElement(e.target).addClass('active-state');\n                if ('which' in e && e.which === 3) {\n                    setTimeout(function () {\n                        $('.active-state').removeClass('active-state');\n                    }, 0);\n                }\n                if (app.params.material && app.params.materialRipple) {\n                    touchStartX = e.pageX;\n                    touchStartY = e.pageY;\n                    rippleTouchStart(e.target, e.pageX, e.pageY);\n                }\n            }\n            function handleMouseMove (e) {\n                $('.active-state').removeClass('active-state');\n                if (app.params.material && app.params.materialRipple) {\n                    rippleTouchMove();\n                }\n            }\n            function handleMouseUp (e) {\n                $('.active-state').removeClass('active-state');\n                if (app.params.material && app.params.materialRipple) {\n                    rippleTouchEnd();\n                }\n            }\n        \n            // Material Touch Ripple Effect\n            function findRippleElement(el) {\n                var needsRipple = app.params.materialRippleElements;\n                var $el = $(el);\n                if ($el.is(needsRipple)) {\n                    if ($el.hasClass('no-ripple')) {\n                        return false;\n                    }\n                    return $el;\n                }\n                else if ($el.parents(needsRipple).length > 0) {\n                    var rippleParent = $el.parents(needsRipple).eq(0);\n                    if (rippleParent.hasClass('no-ripple')) {\n                        return false;\n                    }\n                    return rippleParent;\n                }\n                else return false;\n            }\n            function createRipple(x, y, el) {\n                var box = el[0].getBoundingClientRect();\n                var center = {\n                    x: x - box.left,\n                    y: y - box.top\n                },\n                    height = box.height,\n                    width = box.width;\n                var diameter = Math.max(Math.pow((Math.pow(height, 2) + Math.pow(width, 2)), 0.5), 48);\n        \n                rippleWave = $(\n                    '<div class=\"ripple-wave\" style=\"width: ' + diameter + 'px; height: '+diameter+'px; margin-top:-'+diameter/2+'px; margin-left:-'+diameter/2+'px; left:'+center.x+'px; top:'+center.y+'px;\"></div>'\n                );\n                el.prepend(rippleWave);\n                var clientLeft = rippleWave[0].clientLeft;\n                rippleTransform = 'translate3d('+(-center.x + width/2)+'px, '+(-center.y + height/2)+'px, 0) scale(1)';\n                rippleWave.transform(rippleTransform);\n            }\n        \n            function removeRipple() {\n                if (!rippleWave) return;\n                var toRemove = rippleWave;\n        \n                var removeTimeout = setTimeout(function () {\n                    toRemove.remove();\n                }, 400);\n        \n                rippleWave\n                    .addClass('ripple-wave-fill')\n                    .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'))\n                    .transitionEnd(function () {\n                        clearTimeout(removeTimeout);\n        \n                        var rippleWave = $(this)\n                            .addClass('ripple-wave-out')\n                            .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'));\n        \n                        removeTimeout = setTimeout(function () {\n                            rippleWave.remove();\n                        }, 700);\n        \n                        setTimeout(function () {\n                            rippleWave.transitionEnd(function(){\n                                clearTimeout(removeTimeout);\n                                $(this).remove();\n                            });\n                        }, 0);\n                    });\n        \n                rippleWave = rippleTarget = undefined;\n            }\n        \n            function rippleTouchStart (el, x, y) {\n                rippleTarget = findRippleElement(el);\n                if (!rippleTarget || rippleTarget.length === 0) {\n                    rippleTarget = undefined;\n                    return;\n                }\n                if (!isInsideScrollableView(rippleTarget)) {\n                    createRipple(touchStartX, touchStartY, rippleTarget);\n                }\n                else {\n                    rippleTimeout = setTimeout(function () {\n                        createRipple(touchStartX, touchStartY, rippleTarget);\n                    }, 80);\n                }\n            }\n            function rippleTouchMove() {\n                clearTimeout(rippleTimeout);\n                removeRipple();\n            }\n            function rippleTouchEnd() {\n                if (rippleWave) {\n                    removeRipple();\n                }\n                else if (rippleTarget && !isMoved) {\n                    clearTimeout(rippleTimeout);\n                    createRipple(touchStartX, touchStartY, rippleTarget);\n                    setTimeout(removeRipple, 0);\n                }\n                else {\n                    removeRipple();\n                }\n            }\n        \n            // Send Click\n            function sendClick(e) {\n                var touch = e.changedTouches[0];\n                var evt = document.createEvent('MouseEvents');\n                var eventType = 'click';\n                if (app.device.android && targetElement.nodeName.toLowerCase() === 'select') {\n                    eventType = 'mousedown';\n                }\n                evt.initMouseEvent(eventType, true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n                evt.forwardedTouchEvent = true;\n                targetElement.dispatchEvent(evt);\n            }\n        \n            // Touch Handlers\n            function handleTouchStart(e) {\n                isMoved = false;\n                tapHoldFired = false;\n                if (e.targetTouches.length > 1) {\n                    if (activableElement) removeActive();\n                    return true;\n                }\n                if (e.touches.length > 1 && activableElement) {\n                    removeActive();\n                }\n                if (app.params.tapHold) {\n                    if (tapHoldTimeout) clearTimeout(tapHoldTimeout);\n                    tapHoldTimeout = setTimeout(function () {\n                        if (e && e.touches && e.touches.length > 1) return;\n                        tapHoldFired = true;\n                        e.preventDefault();\n                        $(e.target).trigger('taphold');\n                    }, app.params.tapHoldDelay);\n                }\n                if (needsFastClickTimeOut) clearTimeout(needsFastClickTimeOut);\n                needsFastClick = targetNeedsFastClick(e.target);\n        \n                if (!needsFastClick) {\n                    trackClick = false;\n                    return true;\n                }\n                if (app.device.ios || (app.device.android && 'getSelection' in window)) {\n                    var selection = window.getSelection();\n                    if (selection.rangeCount && selection.focusNode !== document.body && (!selection.isCollapsed || document.activeElement === selection.focusNode)) {\n                        activeSelection = true;\n                        return true;\n                    }\n                    else {\n                        activeSelection = false;\n                    }\n                }\n                if (app.device.android)  {\n                    if (androidNeedsBlur(e.target)) {\n                        document.activeElement.blur();\n                    }\n                }\n        \n                trackClick = true;\n                targetElement = e.target;\n                touchStartTime = (new Date()).getTime();\n                touchStartX = e.targetTouches[0].pageX;\n                touchStartY = e.targetTouches[0].pageY;\n        \n                // Detect scroll parent\n                if (app.device.ios) {\n                    scrollParent = undefined;\n                    $(targetElement).parents().each(function () {\n                        var parent = this;\n                        if (parent.scrollHeight > parent.offsetHeight && !scrollParent) {\n                            scrollParent = parent;\n                            scrollParent.f7ScrollTop = scrollParent.scrollTop;\n                        }\n                    });\n                }\n                if ((e.timeStamp - lastClickTime) < app.params.fastClicksDelayBetweenClicks) {\n                    e.preventDefault();\n                }\n        \n                if (app.params.activeState) {\n                    activableElement = findActivableElement(targetElement);\n                    // If it's inside a scrollable view, we don't trigger active-state yet,\n                    // because it can be a scroll instead. Based on the link:\n                    // http://labnote.beedesk.com/click-scroll-and-pseudo-active-on-mobile-webk\n                    if (!isInsideScrollableView(activableElement)) {\n                        addActive();\n                    } else {\n                        activeTimeout = setTimeout(addActive, 80);\n                    }\n                }\n                if (app.params.material && app.params.materialRipple) {\n                    rippleTouchStart(targetElement, touchStartX, touchStartY);\n                }\n            }\n            function handleTouchMove(e) {\n                if (!trackClick) return;\n                var _isMoved = false;\n                var distance = app.params.fastClicksDistanceThreshold;\n                if (distance) {\n                    var pageX = e.targetTouches[0].pageX;\n                    var pageY = e.targetTouches[0].pageY;\n                    if (Math.abs(pageX - touchStartX) > distance ||  Math.abs(pageY - touchStartY) > distance) {\n                        _isMoved = true;\n                    }\n                }\n                else {\n                    _isMoved = true;\n                }\n                if (_isMoved) {\n                    trackClick = false;\n                    targetElement = null;\n                    isMoved = true;\n                    if (app.params.tapHold) {\n                        clearTimeout(tapHoldTimeout);\n                    }\n        \t\t\tif (app.params.activeState) {\n        \t\t\t\tclearTimeout(activeTimeout);\n        \t\t\t\tremoveActive();\n        \t\t\t}\n                    if (app.params.material && app.params.materialRipple) {\n                        rippleTouchMove();\n                    }\n                }\n            }\n            function handleTouchEnd(e) {\n                clearTimeout(activeTimeout);\n                clearTimeout(tapHoldTimeout);\n        \n                if (!trackClick) {\n                    if (!activeSelection && needsFastClick) {\n                        if (!(app.device.android && !e.cancelable)) {\n                            e.preventDefault();\n                        }\n                    }\n                    return true;\n                }\n        \n                if (document.activeElement === e.target) {\n                    if (app.params.activeState) removeActive();\n                    if (app.params.material && app.params.materialRipple) {\n                        rippleTouchEnd();\n                    }\n                    return true;\n                }\n        \n                if (!activeSelection) {\n                    e.preventDefault();\n                }\n        \n                if ((e.timeStamp - lastClickTime) < app.params.fastClicksDelayBetweenClicks) {\n                    setTimeout(removeActive, 0);\n                    return true;\n                }\n        \n                lastClickTime = e.timeStamp;\n        \n                trackClick = false;\n        \n                if (app.device.ios && scrollParent) {\n                    if (scrollParent.scrollTop !== scrollParent.f7ScrollTop) {\n                        return false;\n                    }\n                }\n        \n                // Add active-state here because, in a very fast tap, the timeout didn't\n                // have the chance to execute. Removing active-state in a timeout gives\n                // the chance to the animation execute.\n                if (app.params.activeState) {\n                    addActive();\n                    setTimeout(removeActive, 0);\n                }\n                // Remove Ripple\n                if (app.params.material && app.params.materialRipple) {\n                    rippleTouchEnd();\n                }\n        \n                // Trigger focus when required\n                if (targetNeedsFocus(targetElement)) {\n                    if (app.device.ios && app.device.webView) {\n                        if ((event.timeStamp - touchStartTime) > 159) {\n                            targetElement = null;\n                            return false;\n                        }\n                        targetElement.focus();\n                        return false;\n                    }\n                    else {\n                        targetElement.focus();\n                    }\n                }\n        \n                // Blur active elements\n                if (document.activeElement && targetElement !== document.activeElement && document.activeElement !== document.body && targetElement.nodeName.toLowerCase() !== 'label') {\n                    document.activeElement.blur();\n                }\n        \n                // Send click\n                e.preventDefault();\n                sendClick(e);\n                return false;\n            }\n            function handleTouchCancel(e) {\n                trackClick = false;\n                targetElement = null;\n        \n                // Remove Active State\n                clearTimeout(activeTimeout);\n                clearTimeout(tapHoldTimeout);\n                if (app.params.activeState) {\n                    removeActive();\n                }\n        \n                // Remove Ripple\n                if (app.params.material && app.params.materialRipple) {\n                    rippleTouchEnd();\n                }\n            }\n        \n            function handleClick(e) {\n                var allowClick = false;\n        \n                if (trackClick) {\n                    targetElement = null;\n                    trackClick = false;\n                    return true;\n                }\n                if (e.target.type === 'submit' && e.detail === 0) {\n                    return true;\n                }\n                if (!targetElement) {\n                    if (!isFormElement(e.target)) {\n                        allowClick =  true;\n                    }\n                }\n                if (!needsFastClick) {\n                    allowClick = true;\n                }\n                if (document.activeElement === targetElement) {\n                    allowClick =  true;\n                }\n                if (e.forwardedTouchEvent) {\n                    allowClick =  true;\n                }\n                if (!e.cancelable) {\n                    allowClick =  true;\n                }\n                if (app.params.tapHold && app.params.tapHoldPreventClicks && tapHoldFired) {\n                    allowClick = false;\n                }\n                if (!allowClick) {\n                    e.stopImmediatePropagation();\n                    e.stopPropagation();\n                    if (targetElement) {\n                        if (targetNeedsPrevent(targetElement) || isMoved) {\n                            e.preventDefault();\n                        }\n                    }\n                    else {\n                        e.preventDefault();\n                    }\n                    targetElement = null;\n                }\n                needsFastClickTimeOut = setTimeout(function () {\n                    needsFastClick = false;\n                }, (app.device.ios || app.device.androidChrome ? 100 : 400));\n        \n                if (app.params.tapHold) {\n                    tapHoldTimeout = setTimeout(function () {\n                        tapHoldFired = false;\n                    }, (app.device.ios || app.device.androidChrome ? 100 : 400));\n                }\n        \n                return allowClick;\n            }\n            if (app.support.touch) {\n                document.addEventListener('click', handleClick, true);\n        \n                document.addEventListener('touchstart', handleTouchStart);\n                document.addEventListener('touchmove', handleTouchMove);\n                document.addEventListener('touchend', handleTouchEnd);\n                document.addEventListener('touchcancel', handleTouchCancel);\n            }\n            else {\n                if (app.params.activeState) {\n                    document.addEventListener('mousedown', handleMouseDown);\n                    document.addEventListener('mousemove', handleMouseMove);\n                    document.addEventListener('mouseup', handleMouseUp);\n                }\n            }\n            if (app.params.material && app.params.materialRipple) {\n                document.addEventListener('contextmenu', function (e) {\n                    if (activableElement) removeActive();\n                    rippleTouchEnd();\n                });\n            }\n        \n        };\n        \n\n        /*===============================================================================\n        ************   Handle clicks and make them fast (on tap);   ************\n        ===============================================================================*/\n        app.initClickEvents = function () {\n            function handleScrollTop(e) {\n                /*jshint validthis:true */\n                var clicked = $(this);\n                var target = $(e.target);\n                var isLink = clicked[0].nodeName.toLowerCase() === 'a' ||\n                             clicked.parents('a').length > 0 ||\n                             target[0].nodeName.toLowerCase() === 'a' ||\n                             target.parents('a').length > 0;\n        \n                if (isLink) return;\n                var pageContent, page;\n                if (app.params.scrollTopOnNavbarClick && clicked.is('.navbar .center')) {\n                    // Find active page\n                    var navbar = clicked.parents('.navbar');\n        \n                    // Static Layout\n                    pageContent = navbar.parents('.page-content');\n        \n                    if (pageContent.length === 0) {\n                        // Fixed Layout\n                        if (navbar.parents('.page').length > 0) {\n                            pageContent = navbar.parents('.page').find('.page-content');\n                        }\n                        // Through Layout\n                        if (pageContent.length === 0) {\n                            if (navbar.nextAll('.pages').length > 0) {\n                                pageContent = navbar.nextAll('.pages').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');\n                            }\n                        }\n                    }\n                }\n                if (app.params.scrollTopOnStatusbarClick && clicked.is('.statusbar-overlay')) {\n                    if ($('.popup.modal-in').length > 0) {\n                        // Check for opened popup\n                        pageContent = $('.popup.modal-in').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');\n                    }\n                    else if ($('.panel.active').length > 0) {\n                        // Check for opened panel\n                        pageContent = $('.panel.active').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');\n                    }\n                    else if ($('.views > .view.active').length > 0) {\n                        // View in tab bar app layout\n                        pageContent = $('.views > .view.active').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');\n                    }\n                    else {\n                        // Usual case\n                        pageContent = $('.views').find('.page:not(.page-on-left):not(.page-on-right):not(.cached)').find('.page-content');\n                    }\n                }\n        \n                if (pageContent && pageContent.length > 0) {\n                    // Check for tab\n                    if (pageContent.hasClass('tab')) {\n                        pageContent = pageContent.parent('.tabs').children('.page-content.active');\n                    }\n                    if (pageContent.length > 0) pageContent.scrollTop(0, 300);\n                }\n            }\n            function handleClicks(e) {\n                /*jshint validthis:true */\n                var clicked = $(this);\n                var url = clicked.attr('href');\n                var isLink = clicked[0].nodeName.toLowerCase() === 'a';\n        \n                // Check if link is external\n                if (isLink) {\n                    if (clicked.is(app.params.externalLinks) || (url && url.indexOf('javascript:') >= 0)) {\n                        if(url && clicked.attr('target') === '_system') {\n                            e.preventDefault();\n                            window.open(url, '_system');\n                        }\n                        return;\n                    }\n                }\n        \n                // Collect Clicked data- attributes\n                var clickedData = clicked.dataset();\n        \n                // Smart Select\n                if (clicked.hasClass('smart-select')) {\n                    if (app.smartSelectOpen) app.smartSelectOpen(clicked);\n                }\n        \n                // Open Panel\n                if (clicked.hasClass('open-panel')) {\n                    if ($('.panel').length === 1) {\n                        if ($('.panel').hasClass('panel-left')) app.openPanel('left');\n                        else app.openPanel('right');\n                    }\n                    else {\n                        if (clickedData.panel === 'right') app.openPanel('right');\n                        else app.openPanel('left');\n                    }\n                }\n                // Close Panel\n                if (clicked.hasClass('close-panel')) {\n                    app.closePanel();\n                }\n        \n                if (clicked.hasClass('panel-overlay') && app.params.panelsCloseByOutside) {\n                    app.closePanel();\n                }\n                // Popover\n                if (clicked.hasClass('open-popover')) {\n                    var popover;\n                    if (clickedData.popover) {\n                        popover = clickedData.popover;\n                    }\n                    else popover = '.popover';\n                    app.popover(popover, clicked);\n                }\n                if (clicked.hasClass('close-popover')) {\n                    app.closeModal('.popover.modal-in');\n                }\n                // Popup\n                var popup;\n                if (clicked.hasClass('open-popup')) {\n                    if (clickedData.popup) {\n                        popup = clickedData.popup;\n                    }\n                    else popup = '.popup';\n                    app.popup(popup);\n                }\n                if (clicked.hasClass('close-popup')) {\n                    if (clickedData.popup) {\n                        popup = clickedData.popup;\n                    }\n                    else popup = '.popup.modal-in';\n                    app.closeModal(popup);\n                }\n                // Login Screen\n                var loginScreen;\n                if (clicked.hasClass('open-login-screen')) {\n                    if (clickedData.loginScreen) {\n                        loginScreen = clickedData.loginScreen;\n                    }\n                    else loginScreen = '.login-screen';\n                    app.loginScreen(loginScreen);\n                }\n                if (clicked.hasClass('close-login-screen')) {\n                    app.closeModal('.login-screen.modal-in');\n                }\n                // Close Modal\n                if (clicked.hasClass('modal-overlay')) {\n                    if ($('.modal.modal-in').length > 0 && app.params.modalCloseByOutside)\n                        app.closeModal('.modal.modal-in');\n                    if ($('.actions-modal.modal-in').length > 0 && app.params.actionsCloseByOutside)\n                        app.closeModal('.actions-modal.modal-in');\n        \n                    if ($('.popover.modal-in').length > 0) app.closeModal('.popover.modal-in');\n                }\n                if (clicked.hasClass('popup-overlay')) {\n                    if ($('.popup.modal-in').length > 0 && app.params.popupCloseByOutside)\n                        app.closeModal('.popup.modal-in');\n                }\n                if (clicked.hasClass('picker-modal-overlay')) {\n                    if ($('.picker-modal.modal-in').length > 0)\n                        app.closeModal('.picker-modal.modal-in');\n                }\n        \n                // Picker\n                if (clicked.hasClass('close-picker')) {\n                    var pickerToClose = $('.picker-modal.modal-in');\n                    if (pickerToClose.length > 0) {\n                        app.closeModal(pickerToClose);\n                    }\n                    else {\n                        pickerToClose = $('.popover.modal-in .picker-modal');\n                        if (pickerToClose.length > 0) {\n                            app.closeModal(pickerToClose.parents('.popover'));\n                        }\n                    }\n                }\n                if (clicked.hasClass('open-picker')) {\n                    var pickerToOpen;\n                    if (clickedData.picker) {\n                        pickerToOpen = clickedData.picker;\n                    }\n                    else pickerToOpen = '.picker-modal';\n                    app.pickerModal(pickerToOpen, clicked);\n                }\n        \n                // Tabs\n                var isTabLink;\n                if (clicked.hasClass('tab-link')) {\n                    isTabLink = true;\n                    app.showTab(clickedData.tab || clicked.attr('href'), clicked);\n                }\n                // Swipeout Close\n                if (clicked.hasClass('swipeout-close')) {\n                    app.swipeoutClose(clicked.parents('.swipeout-opened'));\n                }\n                // Swipeout Delete\n                if (clicked.hasClass('swipeout-delete')) {\n                    if (clickedData.confirm) {\n                        var text = clickedData.confirm;\n                        var title = clickedData.confirmTitle;\n                        if (title) {\n                            app.confirm(text, title, function () {\n                                app.swipeoutDelete(clicked.parents('.swipeout'));\n                            }, function () {\n                                if (clickedData.closeOnCancel) app.swipeoutClose(clicked.parents('.swipeout'));\n                            });\n                        }\n                        else {\n                            app.confirm(text, function () {\n                                app.swipeoutDelete(clicked.parents('.swipeout'));\n                            }, function () {\n                                if (clickedData.closeOnCancel) app.swipeoutClose(clicked.parents('.swipeout'));\n                            });\n                        }\n                    }\n                    else {\n                        app.swipeoutDelete(clicked.parents('.swipeout'));\n                    }\n        \n                }\n                // Sortable\n                if (clicked.hasClass('toggle-sortable')) {\n                    app.sortableToggle(clickedData.sortable);\n                }\n                if (clicked.hasClass('open-sortable')) {\n                    app.sortableOpen(clickedData.sortable);\n                }\n                if (clicked.hasClass('close-sortable')) {\n                    app.sortableClose(clickedData.sortable);\n                }\n                // Accordion\n                if (clicked.hasClass('accordion-item-toggle') || (clicked.hasClass('item-link') && clicked.parent().hasClass('accordion-item'))) {\n                    var accordionItem = clicked.parent('.accordion-item');\n                    if (accordionItem.length === 0) accordionItem = clicked.parents('.accordion-item');\n                    if (accordionItem.length === 0) accordionItem = clicked.parents('li');\n                    app.accordionToggle(accordionItem);\n                }\n        \n                // Speed Dial\n                if (clicked.hasClass('floating-button') && clicked.parent().hasClass('speed-dial')) {\n                    clicked.parent().toggleClass('speed-dial-opened');\n                }\n                if (clicked.hasClass('close-speed-dial')) {\n                    $('.speed-dial-opened').removeClass('speed-dial-opened');\n                }\n        \n                // Load Page\n                if (app.params.ajaxLinks && !clicked.is(app.params.ajaxLinks) || !isLink || !app.params.router) {\n                    return;\n                }\n                if (isLink) {\n                    e.preventDefault();\n                }\n        \n                var validUrl = url && url.length > 0 && url !== '#' && !isTabLink;\n                var template = clickedData.template;\n                if (validUrl || clicked.hasClass('back') || template) {\n                    var view;\n                    if (clickedData.view) {\n                        view = $(clickedData.view)[0].f7View;\n                    }\n                    else {\n                        view = clicked.parents('.' + app.params.viewClass)[0] && clicked.parents('.' + app.params.viewClass)[0].f7View;\n                        if (view && view.params.linksView) {\n                            if (typeof view.params.linksView === 'string') view = $(view.params.linksView)[0].f7View;\n                            else if (view.params.linksView instanceof View) view = view.params.linksView;\n                        }\n                    }\n                    if (!view) {\n                        if (app.mainView) view = app.mainView;\n                    }\n                    if (!view) return;\n        \n                    var pageName;\n                    if (!template) {\n                        if (url && url.indexOf('#') === 0 && url !== '#')  {\n                            if (view.params.domCache) {\n                                pageName = url.split('#')[1];\n                            }\n                            else return;\n                        }\n                        if (url === '#' && !clicked.hasClass('back')) return;\n                    }\n                    else {\n                        url = undefined;\n                    }\n        \n                    var animatePages;\n                    if (typeof clickedData.animatePages !== 'undefined') {\n                        animatePages = clickedData.animatePages;\n                    }\n                    else {\n                        if (clicked.hasClass('with-animation')) animatePages = true;\n                        if (clicked.hasClass('no-animation')) animatePages = false;\n                    }\n        \n                    var options = {\n                        animatePages: animatePages,\n                        ignoreCache: clickedData.ignoreCache,\n                        force: clickedData.force,\n                        reload: clickedData.reload,\n                        reloadPrevious: clickedData.reloadPrevious,\n                        pageName: pageName,\n                        pushState: clickedData.pushState,\n                        url: url\n                    };\n        \n                    if (app.params.template7Pages) {\n                        options.contextName = clickedData.contextName;\n                        var context = clickedData.context;\n                        if (context) {\n                            options.context = JSON.parse(context);\n                        }\n                    }\n                    if (template && template in t7.templates) {\n                        options.template = t7.templates[template];\n                    }\n        \n                    if (clicked.hasClass('back')) view.router.back(options);\n                    else view.router.load(options);\n                }\n            }\n            $(document).on('click', 'a, .open-panel, .close-panel, .panel-overlay, .modal-overlay, .popup-overlay, .swipeout-delete, .swipeout-close, .close-popup, .open-popup, .open-popover, .open-login-screen, .close-login-screen .smart-select, .toggle-sortable, .open-sortable, .close-sortable, .accordion-item-toggle, .close-picker, .picker-modal-overlay', handleClicks);\n            if (app.params.scrollTopOnNavbarClick || app.params.scrollTopOnStatusbarClick) {\n                $(document).on('click', '.statusbar-overlay, .navbar .center', handleScrollTop);\n            }\n        \n            // Prevent scrolling on overlays\n            function preventScrolling(e) {\n                e.preventDefault();\n            }\n            if (app.support.touch && !app.device.android) {\n                $(document).on((app.params.fastClicks ? 'touchstart' : 'touchmove'), '.panel-overlay, .modal-overlay, .preloader-indicator-overlay, .popup-overlay, .searchbar-overlay', preventScrolling);\n            }\n        };\n        \n\n        /*======================================================\n        ************   App Resize Actions   ************\n        ======================================================*/\n        // Prevent iPad horizontal body scrolling when soft keyboard is opened\n        function _fixIpadBodyScrolLeft() {\n            if (app.device.ipad) {\n                document.body.scrollLeft = 0;\n                setTimeout(function () {\n                    document.body.scrollLeft = 0;\n                }, 0);\n            }\n        }\n        app.initResize = function () {\n            $(window).on('resize', app.resize);\n            $(window).on('orientationchange', app.orientationchange);\n        };\n        app.resize = function () {\n            if (app.sizeNavbars) app.sizeNavbars();\n            _fixIpadBodyScrolLeft();\n            \n        };\n        app.orientationchange = function () {\n            if (app.device && app.device.minimalUi) {\n                if (window.orientation === 90 || window.orientation === -90) document.body.scrollTop = 0;\n            }\n            _fixIpadBodyScrolLeft();\n        };\n        \n\n        /*===============================================================================\n        ************   Store and parse forms data   ************\n        ===============================================================================*/\n        app.formsData = {};\n        app.formStoreData = function (formId, formJSON) {\n            // Store form data in app.formsData\n            app.formsData[formId] = formJSON;\n        \n            // Store form data in local storage also\n            app.ls['f7form-' + formId] = JSON.stringify(formJSON);\n        };\n        app.formDeleteData = function (formId) {\n            // Delete form data from app.formsData\n            if (app.formsData[formId]) {\n                app.formsData[formId] = '';\n                delete app.formsData[formId];\n            }\n        \n            // Delete form data from local storage also\n            if (app.ls['f7form-' + formId]) {\n                app.ls['f7form-' + formId] = '';\n                app.ls.removeItem('f7form-' + formId);\n            }\n        };\n        app.formGetData = function (formId) {\n            // First of all check in local storage\n            if (app.ls['f7form-' + formId]) {\n                return JSON.parse(app.ls['f7form-' + formId]);\n            }\n            // Try to get it from formsData obj\n            else if (app.formsData[formId]) return app.formsData[formId];\n        };\n        app.formToData = function (form) {\n            form = $(form);\n            if (form.length !== 1) return false;\n        \n            // Form data\n            var formData = {};\n        \n            // Skip input types\n            var skipTypes = ['submit', 'image', 'button', 'file'];\n            var skipNames = [];\n            form.find('input, select, textarea').each(function () {\n                var input = $(this);\n                var name = input.attr('name');\n                var type = input.attr('type');\n                var tag = this.nodeName.toLowerCase();\n                if (skipTypes.indexOf(type) >= 0) return;\n                if (skipNames.indexOf(name) >= 0 || !name) return;\n                if (tag === 'select' && input.prop('multiple')) {\n                    skipNames.push(name);\n                    formData[name] = [];\n                    form.find('select[name=\"' + name + '\"] option').each(function () {\n                        if (this.selected) formData[name].push(this.value);\n                    });\n                }\n                else {\n                    switch (type) {\n                        case 'checkbox' :\n                            skipNames.push(name);\n                            formData[name] = [];\n                            form.find('input[name=\"' + name + '\"]').each(function () {\n                                if (this.checked) formData[name].push(this.value);\n                            });\n                            break;\n                        case 'radio' :\n                            skipNames.push(name);\n                            form.find('input[name=\"' + name + '\"]').each(function () {\n                                if (this.checked) formData[name] = this.value;\n                            });\n                            break;\n                        default :\n                            formData[name] = input.val();\n                            break;\n                    }\n                }\n                    \n            });\n            form.trigger('formToJSON formToData', {formData: formData});\n        \n            return formData;\n        };\n        app.formToJSON = app.formToData;\n        app.formFromData = function (form, formData) {\n            form = $(form);\n            if (form.length !== 1) return false;\n        \n            // Skip input types\n            var skipTypes = ['submit', 'image', 'button', 'file'];\n            var skipNames = [];\n        \n            form.find('input, select, textarea').each(function () {\n                var input = $(this);\n                var name = input.attr('name');\n                var type = input.attr('type');\n                var tag = this.nodeName.toLowerCase();\n                if (!formData[name]) return;\n                if (skipTypes.indexOf(type) >= 0) return;\n                if (skipNames.indexOf(name) >= 0 || !name) return;\n                if (tag === 'select' && input.prop('multiple')) {\n                    skipNames.push(name);\n                    form.find('select[name=\"' + name + '\"] option').each(function () {\n                        if (formData[name].indexOf(this.value) >= 0) this.selected = true;\n                        else this.selected = false;\n                    });\n                }\n                else {\n                    switch (type) {\n                        case 'checkbox' :\n                            skipNames.push(name);\n                            form.find('input[name=\"' + name + '\"]').each(function () {\n                                if (formData[name].indexOf(this.value) >= 0) this.checked = true;\n                                else this.checked = false;\n                            });\n                            break;\n                        case 'radio' :\n                            skipNames.push(name);\n                            form.find('input[name=\"' + name + '\"]').each(function () {\n                                if (formData[name] === this.value) this.checked = true;\n                                else this.checked = false;\n                            });\n                            break;\n                        default :\n                            input.val(formData[name]);\n                            break;\n                    }\n                }\n                if (tag === 'select' && input.parents('.smart-select').length > 0) {\n                    input.trigger('change');\n                }\n            });\n            form.trigger('formFromJSON formFromData', {formData: formData});\n        };\n        app.formFromJSON = app.formFromData;\n        \n        app.initFormsStorage = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var forms = pageContainer.find('form.store-data');\n            if (forms.length === 0) return;\n        \n            // Parse forms data and fill form if there is such data\n            forms.each(function () {\n                var id = this.getAttribute('id');\n                if (!id) return;\n                var formData = app.formGetData(id);\n                if (formData) app.formFromData(this, formData);\n            });\n            // Update forms data on inputs change\n            function storeForm() {\n                /*jshint validthis:true */\n                var form = $(this);\n                var formId = form[0].id;\n                if (!formId) return;\n                var formJSON = app.formToData(form);\n                if (!formJSON) return;\n                app.formStoreData(formId, formJSON);\n                form.trigger('store', {data: formJSON});\n            }\n            forms.on('change submit', storeForm);\n        \n            // Detach Listeners\n            function pageBeforeRemove() {\n                forms.off('change submit', storeForm);\n                pageContainer.off('pageBeforeRemove', pageBeforeRemove);\n            }\n            pageContainer.on('pageBeforeRemove', pageBeforeRemove);\n        };\n\n        /*===============================================================================\n        ************   Ajax submit for forms   ************\n        ===============================================================================*/\n        // Ajax submit on forms\n        $(document).on('submit change', 'form.ajax-submit, form.ajax-submit-onchange', function (e) {\n            var form = $(this);\n            if (e.type === 'change' && !form.hasClass('ajax-submit-onchange')) return;\n            if (e.type === 'submit') e.preventDefault();\n        \n            var method = (form.attr('method') || 'GET').toUpperCase();\n            var contentType = form.prop('enctype') || form.attr('enctype');\n        \n            var url = form.attr('action');\n            if (!url) return;\n        \n            var data;\n            if (method === 'POST') data = new FormData(form[0]);\n            else data = $.serializeObject(app.formToJSON(form[0]));\n        \n            var xhr = $.ajax({\n                method: method,\n                url: url,\n                contentType: contentType,\n                data: data,\n                beforeSend: function (xhr) {\n                    form.trigger('beforeSubmit', {data:data, xhr: xhr});\n                },\n                error: function (xhr) {\n                    form.trigger('submitError', {data:data, xhr: xhr});  \n                },\n                success: function (data) {\n                    form.trigger('submitted', {data: data, xhr: xhr});\n                }\n            });\n        });\n        \n        \n\n        /*===============================================================================\n        ************   Resizable textarea   ************\n        ===============================================================================*/\n        app.resizeTextarea = function (textarea) {\n            textarea = $(textarea);\n            if (!textarea.hasClass('resizable')) {\n                return;\n            }\n            textarea.css({'height': ''});\n            var height = textarea[0].offsetHeight;\n            var diff = height - textarea[0].clientHeight;\n            var scrollHeight = textarea[0].scrollHeight;\n        \n            if (scrollHeight + diff > height) {\n                var newAreaHeight = scrollHeight + diff;\n                textarea.css('height', newAreaHeight + 'px');\n            }\n        };\n        app.resizableTextarea = function (textarea) {\n            textarea = $(textarea);\n            if (textarea.length === 0) return;\n            var textareaTimeout;\n            function handleTextarea() {\n                clearTimeout(textareaTimeout);\n                textareaTimeout = setTimeout(function () {\n                    app.resizeTextarea(textarea);\n                }, 0);\n            }\n            textarea[0].f7DestroyResizableTextarea = function () {\n                textarea.off('change keydown keypress keyup paste cut', handleTextarea);\n            };\n            return textarea.on('change keydown keypress keyup paste cut', handleTextarea);\n        };\n        app.destroyResizableTextarea = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            if (pageContainer.length > 0 && pageContainer.is('textarea') && pageContainer[0].f7DestroyResizableTextarea) {\n                pageContainer[0].f7DestroyResizableTextarea();\n            }\n            else if (pageContainer.length > 0) {\n                pageContainer.find('textarea.resiable').each(function () {\n                    var textarea = this;\n                    if (textarea.f7DestroyResizableTextarea) {\n                        textarea.f7DestroyResizableTextarea ();\n                    }\n                });\n            }\n        };\n        app.initPageResizableTextarea = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var textareas = pageContainer.find('textarea.resizable');\n            textareas.each(function () {\n                app.resizableTextarea(this);\n            });\n        };\n\n        /*======================================================\n        ************   Material Text Inputs   ************\n        ======================================================*/\n        app.initPageMaterialInputs = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var textareas = pageContainer.find('textarea.resizable');\n            pageContainer.find('.item-input').each(function () {\n                var itemInput = $(this);\n                var notInputs = ['checkbox', 'button', 'submit', 'range', 'radio', 'image'];\n                itemInput.find('input, select, textarea').each(function () {\n                    var input = $(this);\n                    if (notInputs.indexOf(input.attr('type')) < 0) {\n                        itemInput.addClass('item-input-field');\n                        if (input.val().trim() !== '') {\n                            input.parents('.item-input, .input-field').add(input.parents('.item-inner')).addClass('not-empty-state');\n                        }\n                    }\n                });\n                if (itemInput.parents('.input-item, .inputs-list').length > 0) return;\n                itemInput.parents('.list-block').eq(0).addClass('inputs-list');\n            });\n        };\n        /*======================================================\n        ************   Material Focus Inputs   ************\n        ======================================================*/\n        app.initMaterialWatchInputs = function () {\n            var notInputs = ['checkbox', 'button', 'submit', 'range', 'radio', 'image'];\n            function addFocusState(e) {\n                /*jshint validthis:true*/\n                var i = $(this);\n                var type = i.attr('type');\n                if (notInputs.indexOf(type) >= 0) return;\n                var els = i.add(i.parents('.item-input, .input-field')).add(i.parents('.item-inner').eq(0));\n                els.addClass('focus-state');\n            }\n            function removeFocusState(e) {\n                /*jshint validthis:true*/\n                var i = $(this), value = i.val();\n                var type = i.attr('type');\n                if (notInputs.indexOf(type) >= 0) return;\n                var els = i.add(i.parents('.item-input, .input-field')).add(i.parents('.item-inner').eq(0));\n                els.removeClass('focus-state');\n                if (value && value.trim() !== '') {\n                    els.addClass('not-empty-state');\n                }\n                else {\n                    els.removeClass('not-empty-state');\n                }\n            }\n            function watchChangeState(e) {\n                /*jshint validthis:true*/\n                var i = $(this), value = i.val();\n                var type = i.attr('type');\n                if (notInputs.indexOf(type) >= 0) return;\n                var els = i.add(i.parents('.item-input, .input-field')).add(i.parents('.item-inner').eq(0));\n                if (value && value.trim() !== '') {\n                    els.addClass('not-empty-state');\n                }\n                else {\n                    els.removeClass('not-empty-state');\n                }\n            }\n            $(document).on('change', '.item-input input, .item-input select, .item-input textarea, input, textarea, select', watchChangeState, true);\n            $(document).on('focus', '.item-input input, .item-input select, .item-input textarea, input, textarea, select', addFocusState, true);\n            $(document).on('blur', '.item-input input, .item-input select, .item-input textarea, input, textarea, select', removeFocusState, true);\n        };\n\n        /*======================================================\n        ************   Handle Browser's History   ************\n        ======================================================*/\n        app.pushStateQueue = [];\n        app.pushStateClearQueue = function () {\n            if (app.pushStateQueue.length === 0) return;\n            var queue = app.pushStateQueue.pop();\n            var animatePages;\n            if (app.params.pushStateNoAnimation === true) animatePages = false;\n            if (queue.action === 'back') {\n                app.router.back(queue.view, {animatePages: animatePages});\n            }\n            if (queue.action === 'loadPage') {\n                app.router.load(queue.view, {url: queue.stateUrl, animatePages: animatePages, pushState: false});\n            }\n            if (queue.action === 'loadContent') {\n                app.router.load(queue.view, {content: queue.stateContent, animatePages: animatePages, pushState: false});\n            }\n            if (queue.action === 'loadPageName') {\n                app.router.load(queue.view, {pageName: queue.statePageName, url: queue.stateUrl, animatePages: animatePages, pushState: false});\n            }\n        };\n        \n        app.initPushState = function () {\n            var blockPopstate = true;\n            $(window).on('load', function () {\n                setTimeout(function () {\n                    blockPopstate = false;\n                }, 0);\n            });\n        \n            if (document.readyState && document.readyState === 'complete') {\n                blockPopstate = false;\n            }\n        \n            function handlePopState(e) {\n                if (blockPopstate) return;\n                var mainView = app.mainView;\n                if (!mainView) return;\n                var state = e.state;\n                if (!state) {\n                    state = {\n                        viewIndex: app.views.indexOf(mainView),\n                        url : mainView.history[0]\n                    };\n                }\n                if (state.viewIndex < 0) return;\n                var view = app.views[state.viewIndex];\n                var stateUrl = state && state.url || undefined;\n                var stateContent = state && state.content || undefined;\n                var statePageName = state && state.pageName || undefined;\n                var animatePages;\n        \n                if (app.params.pushStateNoAnimation === true) animatePages = false;\n        \n                if (stateUrl !== view.url) {\n                    if (view.history.indexOf(stateUrl) >= 0) {\n                        // Go Back\n                        if (view.allowPageChange) {\n                            app.router.back(view, {url:undefined, animatePages: animatePages, pushState: false, preloadOnly:false});\n                        }\n                        else {\n                            app.pushStateQueue.push({\n                                action: 'back',\n                                view: view\n                            });\n                        }\n                    }\n                    else if (stateContent) {\n                        // Load Page\n                        if (view.allowPageChange) {\n                            app.router.load(view, {content:stateContent, animatePages: animatePages, pushState: false});\n                        }\n                        else {\n                            app.pushStateQueue.unshift({\n                                action: 'loadContent',\n                                stateContent: stateContent,\n                                view: view\n                            });\n                        }\n        \n                    }\n                    else if (statePageName) {\n                        // Load Page by page name with Dom Cache\n                        if (view.allowPageChange) {\n                            app.router.load(view, {pageName:statePageName, url: stateUrl, animatePages: animatePages, pushState: false});\n                        }\n                        else {\n                            app.pushStateQueue.unshift({\n                                action: 'loadPageName',\n                                statePageName: statePageName,\n                                view: view\n                            });\n                        }\n                    }\n                    else  {\n                        // Load Page\n                        if (view.allowPageChange) {\n                            app.router.load(view, {url:stateUrl, animatePages: animatePages, pushState: false});\n                        }\n                        else {\n                            app.pushStateQueue.unshift({\n                                action: 'loadPage',\n                                stateUrl: stateUrl,\n                                view: view\n                            });\n                        }\n                    }\n                }\n            }\n            $(window).on('popstate', handlePopState);\n        };\n        \n\n        /*===========================\n        Framework7 Swiper Additions\n        ===========================*/\n        app.swiper = function (container, params) {\n            return new Swiper(container, params);\n        };\n        app.initPageSwiper = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var swipers = pageContainer.find('.swiper-init, .tabs-swipeable-wrap');\n            if (swipers.length === 0) return;\n            function destroySwiperOnRemove(slider) {\n                function destroySwiper() {\n                    slider.destroy();\n                    pageContainer.off('pageBeforeRemove', destroySwiper);\n                }\n                pageContainer.on('pageBeforeRemove', destroySwiper);\n            }\n            swipers.each(function () {\n                var swiper = $(this), initialSlide;\n                var params;\n                if (swiper.hasClass('tabs-swipeable-wrap')) {\n                    swiper.addClass('swiper-container').children('.tabs').addClass('swiper-wrapper').children('.tab').addClass('swiper-slide');\n                    initialSlide = swiper.children('.tabs').children('.tab.active').index();\n                }\n                if (swiper.data('swiper')) {\n                    params = JSON.parse(swiper.data('swiper'));\n                }\n                else {\n                    params = swiper.dataset();\n                }\n                if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {\n                    params.initialSlide = initialSlide;\n                }\n                if (swiper.hasClass('tabs-swipeable-wrap')) {\n                    params.onSlideChangeStart = function (s) {\n                        app.showTab(s.slides.eq(s.activeIndex));\n                    };\n                }\n                var _slider = app.swiper(swiper[0], params);\n                destroySwiperOnRemove(_slider);\n            });\n        };\n        app.reinitPageSwiper = function (pageContainer) {\n            pageContainer = $(pageContainer);\n            var sliders = pageContainer.find('.swiper-init, .tabs-swipeable-wrap');\n            if (sliders.length === 0) return;\n            for (var i = 0; i < sliders.length; i++) {\n                var sliderInstance = sliders[0].swiper;\n                if (sliderInstance) {\n                    sliderInstance.update(true);\n                }\n            }\n        };\n        \n\n        /*======================================================\n        ************   Photo Browser   ************\n        ======================================================*/\n        var PhotoBrowser = function (params) {\n            var pb = this, i;\n        \n            var defaults = {\n                photos : [],\n                initialSlide: 0,\n                spaceBetween: 20,\n                speed: 300,\n                zoom: true,\n                zoomMax: 3,\n                zoomMin: 1,\n                exposition: true,\n                expositionHideCaptions: false,\n                type: 'standalone',\n                navbar: true,\n                toolbar: true,\n                theme: 'light',\n                swipeToClose: true,\n                backLinkText: 'Close',\n                ofText: 'of',\n                loop: false,\n                lazyLoading: false,\n                lazyLoadingInPrevNext: false,\n                lazyLoadingOnTransitionStart: false,\n                material: app.params.material,\n                materialPreloaderSvg: app.params.materialPreloaderSvg,\n                materialPreloaderHtml: app.params.materialPreloaderHtml,\n                /*\n                Callbacks:\n                onLazyImageLoad(pb, slide, img)\n                onLazyImageReady(pb, slide, img)\n                onOpen(pb)\n                onClose(pb)\n                onTransitionStart(swiper)\n                onTransitionEnd(swiper)\n                onSlideChangeStart(swiper)\n                onSlideChangeEnd(swiper)\n                onTap(swiper, e)\n                onClick(swiper, e)\n                onDoubleTap(swiper, e)\n                onSwipeToClose(pb)\n                */\n            };\n        \n            params = params || {};\n            if (!params.backLinkText && app.params.material) defaults.backLinkText = '';\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined') {\n                    params[def] = defaults[def];\n                }\n            }\n            if (params.maxZoom) {\n                params.zoomMax = params.maxZoom;\n            }\n            if (params.minZoom) {\n                params.zoomMin = params.minZoom;\n            }\n        \n            pb.params = params;\n            pb.params.iconsColorClass = pb.params.iconsColor ? 'color-' + pb.params.iconsColor : (pb.params.theme === 'dark' ? 'color-white' : '');\n            pb.params.preloaderColorClass = pb.params.theme === 'dark' ? 'preloader-white' : '';\n        \n            // Templates\n            var photoTemplate = pb.params.photoTemplate || \n                '<div class=\"photo-browser-slide swiper-slide\">' +\n                    '<span class=\"swiper-zoom-container\">' +\n                        '<img src=\"{{js \"this.url || this\"}}\">' +\n                    '</span>' +\n                '</div>';\n            var photoLazyTemplate = pb.params.lazyPhotoTemplate ||\n                '<div class=\"photo-browser-slide photo-browser-slide-lazy swiper-slide\">' +\n                    '<div class=\"preloader {{@root.preloaderColorClass}}\">{{#if @root.material}}{{@root.materialPreloaderHtml}}{{/if}}</div>' +\n                    '<span class=\"swiper-zoom-container\">' +\n                        '<img data-src=\"{{js \"this.url || this\"}}\" class=\"swiper-lazy\">' +\n                    '</span>' +\n                '</div>';\n            var objectTemplate = pb.params.objectTemplate ||\n                '<div class=\"photo-browser-slide photo-browser-object-slide swiper-slide\">{{js \"this.html || this\"}}</div>';\n            var captionTemplate = pb.params.captionTemplate ||\n                '<div class=\"photo-browser-caption\" data-caption-index=\"{{@index}}\">' +\n                    '{{caption}}' +\n                '</div>';\n            var navbarTemplate = pb.params.navbarTemplate ||\n                '<div class=\"navbar\">' +\n                    '<div class=\"navbar-inner\">' +\n                        '<div class=\"left sliding\">' +\n                            '<a href=\"#\" class=\"link ' + (params.type === 'popup' ? 'close-popup' : 'photo-browser-close-link')+ ' {{#unless backLinkText}}icon-only{{/unless}} {{js \"this.type === \\'page\\' ? \\'back\\' : \\'\\'\"}}\">' +\n                                '<i class=\"icon icon-back {{iconsColorClass}}\"></i>' +\n                                '{{#if backLinkText}}<span>{{backLinkText}}</span>{{/if}}' +\n                            '</a>' +\n                        '</div>' +\n                        '<div class=\"center sliding\">' +\n                            '<span class=\"photo-browser-current\"></span> ' +\n                            '<span class=\"photo-browser-of\">{{ofText}}</span> ' +\n                            '<span class=\"photo-browser-total\"></span>' +\n                        '</div>' +\n                        '<div class=\"right\"></div>' +\n                    '</div>' +\n                '</div>';\n            var toolbarTemplate = pb.params.toolbarTemplate ||\n                '<div class=\"toolbar tabbar\">' +\n                    '<div class=\"toolbar-inner\">' +\n                        '<a href=\"#\" class=\"link photo-browser-prev\">' +\n                            '<i class=\"icon icon-prev {{iconsColorClass}}\"></i>' +\n                        '</a>' +\n                        '<a href=\"#\" class=\"link photo-browser-next\">' +\n                            '<i class=\"icon icon-next {{iconsColorClass}}\"></i>' +\n                        '</a>' +\n                    '</div>' +\n                '</div>';\n        \n            var htmlTemplate = t7.compile('<div class=\"photo-browser photo-browser-{{theme}}\">' +\n                    '<div class=\"view navbar-fixed toolbar-fixed\">' +\n                        '{{#unless material}}{{#if navbar}}' +\n                        navbarTemplate +\n                        '{{/if}}{{/unless}}' +\n                        '<div class=\"page no-toolbar {{#unless navbar}}no-navbar{{/unless}} toolbar-fixed navbar-fixed\" data-page=\"photo-browser-slides\">' +\n                            '{{#if material}}{{#if navbar}}' +\n                            navbarTemplate +\n                            '{{/if}}{{/if}}' +\n                            '{{#if toolbar}}' +\n                            toolbarTemplate +\n                            '{{/if}}' +\n                            '<div class=\"photo-browser-captions photo-browser-captions-{{js \"this.captionsTheme || this.theme\"}}\">' +\n                                '{{#each photos}}{{#if caption}}' +\n                                captionTemplate +\n                                '{{/if}}{{/each}}' +\n                            '</div>' +\n                            '<div class=\"photo-browser-swiper-container swiper-container\">' +\n                                '<div class=\"photo-browser-swiper-wrapper swiper-wrapper\">' +\n                                    '{{#each photos}}' +\n                                    '{{#js_compare \"this.html || ((typeof this === \\'string\\' || this instanceof String) && (this.indexOf(\\'<\\') >= 0 || this.indexOf(\\'>\\') >= 0))\"}}' +\n                                        objectTemplate +\n                                    '{{else}}' +\n                                        '{{#if @root.lazyLoading}}' +\n                                        photoLazyTemplate +\n                                        '{{else}}' +\n                                        photoTemplate +\n                                        '{{/if}}' +\n                                    '{{/js_compare}}' +\n                                    '{{/each}}' +\n                                '</div>' +\n                            '</div>' +\n                        '</div>' +\n                    '</div>' +\n                '</div>')(pb.params);\n        \n            pb.activeIndex = pb.params.initialSlide;\n            pb.openIndex = pb.activeIndex;\n            pb.opened = false;\n        \n            pb.open = function (index) {\n                if (typeof index === 'undefined') index = pb.activeIndex;\n                index = parseInt(index, 10);\n                if (pb.opened && pb.swiper) {\n                    pb.swiper.slideTo(index);\n                    return;\n                }\n                pb.opened = true;\n                pb.openIndex = index;\n                if (pb.params.type === 'standalone') {\n                    app.root.append(htmlTemplate);\n                }\n                if (pb.params.type === 'popup') {\n                    pb.popup = app.popup('<div class=\"popup photo-browser-popup\">' + htmlTemplate + '</div>');\n                    $(pb.popup).on('closed', pb.onPopupClose);\n                }\n                if (pb.params.type === 'page') {\n                    $(document).on('pageBeforeInit', pb.onPageBeforeInit);\n                    $(document).on('pageBeforeRemove', pb.onPageBeforeRemove);\n                    if (!pb.params.view) pb.params.view = app.mainView;\n                    pb.params.view.loadContent(htmlTemplate);\n                    return;\n                }\n                pb.layout(pb.openIndex);\n                if (pb.params.onOpen) {\n                    pb.params.onOpen(pb);\n                }\n        \n            };\n            pb.close = function () {\n                pb.opened = false;\n                if (!pb.swiperContainer || pb.swiperContainer.length === 0) {\n                    return;\n                }\n                if (pb.params.onClose) {\n                    pb.params.onClose(pb);\n                }\n                // Detach events\n                pb.attachEvents(true);\n                // Delete from DOM\n                if (pb.params.type === 'standalone') {\n                    pb.container.removeClass('photo-browser-in').addClass('photo-browser-out').animationEnd(function () {\n                        pb.container.remove();\n                    });\n                }\n                // Destroy slider\n                pb.swiper.destroy();\n                // Delete references\n                pb.swiper = pb.swiperContainer = pb.swiperWrapper = pb.slides = undefined; //gestureSlide = gestureImg = gestureImgWrap = undefined;\n            };\n        \n            pb.onPopupClose = function (e) {\n                pb.close();\n                $(pb.popup).off('pageBeforeInit', pb.onPopupClose);\n            };\n            pb.onPageBeforeInit = function (e) {\n                if (e.detail.page.name === 'photo-browser-slides') {\n                    pb.layout(pb.openIndex);\n                }\n                $(document).off('pageBeforeInit', pb.onPageBeforeInit);\n            };\n            pb.onPageBeforeRemove = function (e) {\n                if (e.detail.page.name === 'photo-browser-slides') {\n                    pb.close();\n                }\n                $(document).off('pageBeforeRemove', pb.onPageBeforeRemove);\n            };\n        \n            pb.onSliderTransitionStart = function (swiper) {\n                pb.activeIndex = swiper.activeIndex;\n        \n                var current = swiper.activeIndex + 1;\n                var total = swiper.slides.length;\n                if (pb.params.loop) {\n                    total = total - 2;\n                    current = current - swiper.loopedSlides;\n                    if (current < 1) current = total + current;\n                    if (current > total) current = current - total;\n                }\n                pb.container.find('.photo-browser-current').text(current);\n                pb.container.find('.photo-browser-total').text(total);\n        \n                $('.photo-browser-prev, .photo-browser-next').removeClass('photo-browser-link-inactive');\n        \n                if (swiper.isBeginning && !pb.params.loop) {\n                    $('.photo-browser-prev').addClass('photo-browser-link-inactive');\n                }\n                if (swiper.isEnd && !pb.params.loop) {\n                    $('.photo-browser-next').addClass('photo-browser-link-inactive');\n                }\n        \n                // Update captions\n                if (pb.captions.length > 0) {\n                    pb.captionsContainer.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');\n                    var captionIndex = pb.params.loop ? swiper.slides.eq(swiper.activeIndex).attr('data-swiper-slide-index') : pb.activeIndex;\n                    pb.captionsContainer.find('[data-caption-index=\"' + captionIndex + '\"]').addClass('photo-browser-caption-active');\n                }\n        \n        \n                // Stop Video\n                var previousSlideVideo = swiper.slides.eq(swiper.previousIndex).find('video');\n                if (previousSlideVideo.length > 0) {\n                    if ('pause' in previousSlideVideo[0]) previousSlideVideo[0].pause();\n                }\n                // Callback\n                if (pb.params.onTransitionStart) pb.params.onTransitionStart(swiper);\n            };\n            pb.onSliderTransitionEnd = function (swiper) {\n                if (pb.params.onTransitionEnd) pb.params.onTransitionEnd(swiper);\n            };\n        \n            pb.layout = function (index) {\n                if (pb.params.type === 'page') {\n                    pb.container = $('.photo-browser-swiper-container').parents('.view');\n                }\n                else {\n                    pb.container = $('.photo-browser');\n                }\n                if (pb.params.type === 'standalone') {\n                    pb.container.addClass('photo-browser-in');\n                    app.sizeNavbars(pb.container);\n                }\n                pb.swiperContainer = pb.container.find('.photo-browser-swiper-container');\n                pb.swiperWrapper = pb.container.find('.photo-browser-swiper-wrapper');\n                pb.slides = pb.container.find('.photo-browser-slide');\n                pb.captionsContainer = pb.container.find('.photo-browser-captions');\n                pb.captions = pb.container.find('.photo-browser-caption');\n        \n                var sliderSettings = {\n                    nextButton: pb.params.nextButton || '.photo-browser-next',\n                    prevButton: pb.params.prevButton || '.photo-browser-prev',\n                    indexButton: pb.params.indexButton,\n                    initialSlide: index,\n                    spaceBetween: pb.params.spaceBetween,\n                    speed: pb.params.speed,\n                    loop: pb.params.loop,\n                    lazyLoading: pb.params.lazyLoading,\n                    lazyLoadingInPrevNext: pb.params.lazyLoadingInPrevNext,\n                    lazyLoadingOnTransitionStart: pb.params.lazyLoadingOnTransitionStart,\n                    preloadImages: pb.params.lazyLoading ? false : true,\n                    zoom: pb.params.zoom,\n                    zoomMax: pb.params.zoomMax,\n                    zoomMin: pb.params.zoomMin,\n                    onTap: function (swiper, e) {\n                        if (pb.params.onTap) pb.params.onTap(swiper, e);\n                    },\n                    onClick: function (swiper, e) {\n                        if (pb.params.exposition) pb.toggleExposition();\n                        if (pb.params.onClick) pb.params.onClick(swiper, e);\n                    },\n                    onDoubleTap: function (swiper, e) {\n                        // pb.toggleZoom(e);\n                        if (pb.params.onDoubleTap) pb.params.onDoubleTap(swiper, e);\n                    },\n                    onTransitionStart: function (swiper) {\n                        pb.onSliderTransitionStart(swiper);\n                    },\n                    onTransitionEnd: function (swiper) {\n                        pb.onSliderTransitionEnd(swiper);\n                    },\n                    onSlideChangeStart: pb.params.onSlideChangeStart,\n                    onSlideChangeEnd: pb.params.onSlideChangeEnd,\n                    onLazyImageLoad: function (swiper, slide, img) {\n                        if (pb.params.onLazyImageLoad) pb.params.onLazyImageLoad(pb, slide, img);\n                    },\n                    onLazyImageReady: function (swiper, slide, img) {\n                        $(slide).removeClass('photo-browser-slide-lazy');\n                        if (pb.params.onLazyImageReady) pb.params.onLazyImageReady(pb, slide, img);\n                    }\n                };\n        \n                if (pb.params.swipeToClose && pb.params.type !== 'page') {\n                    sliderSettings.onTouchStart = pb.swipeCloseTouchStart;\n                    sliderSettings.onTouchMoveOpposite = pb.swipeCloseTouchMove;\n                    sliderSettings.onTouchEnd = pb.swipeCloseTouchEnd;\n                }\n        \n                pb.swiper = app.swiper(pb.swiperContainer, sliderSettings);\n                if (index === 0) {\n                    pb.onSliderTransitionStart(pb.swiper);\n                }\n                pb.attachEvents();\n            };\n            pb.attachEvents = function (detach) {\n                var action = detach ? 'off' : 'on';\n                pb.container.find('.photo-browser-close-link')[action]('click', pb.close);\n            };\n        \n        \n            // Expose\n            pb.exposed = false;\n            pb.toggleExposition = function () {\n                if (pb.container) pb.container.toggleClass('photo-browser-exposed');\n                if (pb.params.expositionHideCaptions) pb.captionsContainer.toggleClass('photo-browser-captions-exposed');\n                pb.exposed = !pb.exposed;\n            };\n            pb.enableExposition = function () {\n                if (pb.container) pb.container.addClass('photo-browser-exposed');\n                if (pb.params.expositionHideCaptions) pb.captionsContainer.addClass('photo-browser-captions-exposed');\n                pb.exposed = true;\n            };\n            pb.disableExposition = function () {\n                if (pb.container) pb.container.removeClass('photo-browser-exposed');\n                if (pb.params.expositionHideCaptions) pb.captionsContainer.removeClass('photo-browser-captions-exposed');\n                pb.exposed = false;\n            };\n        \n            // Swipe Up To Close\n            var swipeToCloseIsTouched = false;\n            var allowSwipeToClose = true;\n            var swipeToCloseDiff, swipeToCloseStart, swipeToCloseCurrent, swipeToCloseStarted = false, swipeToCloseActiveSlide, swipeToCloseTimeStart;\n            pb.swipeCloseTouchStart = function (swiper, e) {\n                if (!allowSwipeToClose) return;\n                swipeToCloseIsTouched = true;\n            };\n            pb.swipeCloseTouchMove = function (swiper, e) {\n                if (!swipeToCloseIsTouched) return;\n                if (!swipeToCloseStarted) {\n                    swipeToCloseStarted = true;\n                    swipeToCloseStart = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                    swipeToCloseActiveSlide = pb.swiper.slides.eq(pb.swiper.activeIndex);\n                    swipeToCloseTimeStart = (new Date()).getTime();\n                }\n                e.preventDefault();\n                swipeToCloseCurrent = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                swipeToCloseDiff = swipeToCloseStart - swipeToCloseCurrent;\n                var opacity = 1 - Math.abs(swipeToCloseDiff) / 300;\n                swipeToCloseActiveSlide.transform('translate3d(0,' + (-swipeToCloseDiff) + 'px,0)');\n                pb.swiper.container.css('opacity', opacity).transition(0);\n            };\n            pb.swipeCloseTouchEnd = function (swiper, e) {\n                swipeToCloseIsTouched = false;\n                if (!swipeToCloseStarted) {\n                    swipeToCloseStarted = false;\n                    return;\n                }\n                swipeToCloseStarted = false;\n                allowSwipeToClose = false;\n                var diff = Math.abs(swipeToCloseDiff);\n                var timeDiff = (new Date()).getTime() - swipeToCloseTimeStart;\n                if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {\n                    setTimeout(function () {\n                        if (pb.params.type === 'standalone') {\n                            pb.close();\n                        }\n                        if (pb.params.type === 'popup') {\n                            app.closeModal(pb.popup);\n                        }\n                        if (pb.params.onSwipeToClose) {\n                            pb.params.onSwipeToClose(pb);\n                        }\n                        allowSwipeToClose = true;\n                    }, 0);\n                    return;\n                }\n                if (diff !== 0) {\n                    swipeToCloseActiveSlide.addClass('transitioning').transitionEnd(function () {\n                        allowSwipeToClose = true;\n                        swipeToCloseActiveSlide.removeClass('transitioning');\n                    });\n                }\n                else {\n                    allowSwipeToClose = true;\n                }\n                pb.swiper.container.css('opacity', '').transition('');\n                swipeToCloseActiveSlide.transform('');\n            };\n        \n            return pb;\n        };\n        \n        app.photoBrowser = function (params) {\n            return new PhotoBrowser(params);\n        };\n        \n\n        /*===============================================================================\n        ************   Autocomplete   ************\n        ===============================================================================*/\n        var Autocomplete = function (params) {\n            var a = this;\n        \n            // Params\n            var defaults = {\n                // Standalone Options\n                /*\n                opener: undefined,\n                */\n                popupCloseText: 'Close',\n                backText: 'Back',\n                searchbarPlaceholderText: 'Search...',\n                searchbarCancelText: 'Cancel',\n                openIn: 'page',\n                backOnSelect: false,\n                notFoundText: 'Nothing found',\n                /*\n                pageTitle: undefined,\n                */\n        \n                // Handle Data\n                /*\n                source: undefined,\n                limit: undefined,\n                */\n                valueProperty: 'id',\n                textProperty: 'text',\n        \n                // Dropdown Options\n                /*\n                dropdownPlaceholderText: 'Type anything...',\n                */\n                updateInputValueOnSelect: true,\n                expandInput: false,\n        \n                // Preloader\n                preloaderColor: false,\n                preloader: false,\n        \n                // Templates\n                /*\n                itemTemplate: undefined,\n                navbarTemplate: undefined,\n                dropdownTemplate: undefined\n                dropdownItemTemplate: undefined,\n                dropdownPlaceholderTemplate: undefined\n                */\n        \n                // Color themes\n                /*\n                navbarTheme: undefined,\n                formTheme: undefined,\n                */\n        \n                // Callbacks\n                /*\n                onChange: function (a, value) - for not dropdown\n                onOpen: function (a)\n                onClose: function (a)\n                */\n            };\n        \n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined') {\n                    params[def] = defaults[def];\n                }\n            }\n            a.params = params;\n        \n            // Opener Link & View\n            if (a.params.opener) {\n                a.opener = $(a.params.opener);\n            }\n            var view = a.params.view;\n            if (!a.params.view && a.opener && a.opener.length) {\n                // Find related view\n                view = a.opener.parents('.' + app.params.viewClass);\n                if (view.length === 0) return;\n                view = view[0].f7View;\n            }\n        \n            // Input\n            if (a.params.input) {\n                a.input = $(a.params.input);\n                if (a.input.length === 0 && a.params.openIn === 'dropdown') return;\n            }\n        \n            // Array with selected items\n            a.value = a.params.value || [];\n        \n            // ID & Inputs\n            a.id = (new Date()).getTime();\n            a.inputType = a.params.multiple ? 'checkbox' : 'radio';\n            a.inputName = a.inputType + '-' + a.id;\n        \n            // Is Material\n            var material = app.params.material;\n        \n            // Back On Select\n            var backOnSelect = a.params.backOnSelect;\n        \n            if (a.params.openIn !== 'dropdown') {\n                // Item Template\n                a.itemTemplate = t7.compile(a.params.itemTemplate ||\n                    '<li>' +\n                        '<label class=\"label-{{inputType}} item-content\">' +\n                            '<input type=\"{{inputType}}\" name=\"{{inputName}}\" value=\"{{value}}\" {{#if selected}}checked{{/if}}>' +\n                            '{{#if material}}' +\n                                '<div class=\"item-media\">' +\n                                    '<i class=\"icon icon-form-{{inputType}}\"></i>' +\n                                '</div>' +\n                                '<div class=\"item-inner\">' +\n                                    '<div class=\"item-title\">{{text}}</div>' +\n                                '</div>' +\n                            '{{else}}' +\n                                '{{#if checkbox}}' +\n                                '<div class=\"item-media\">' +\n                                    '<i class=\"icon icon-form-checkbox\"></i>' +\n                                '</div>' +\n                                '{{/if}}' +\n                                '<div class=\"item-inner\">' +\n                                    '<div class=\"item-title\">{{text}}</div>' +\n                                '</div>' +\n                            '{{/if}}' +\n                        '</label>' +\n                    '</li>'\n                );\n                // Page Layout\n                var pageTitle = a.params.pageTitle || '';\n                if (!pageTitle && a.opener && a.opener.length) {\n                    pageTitle = a.opener.find('.item-title').text();\n                }\n                var pageName = 'autocomplete-' + a.inputName;\n        \n                var navbarTheme = a.params.navbarTheme,\n                    formTheme = a.params.formTheme;\n        \n                // Navbar HTML\n                var navbarHTML;\n                var noNavbar = '', noToolbar = '', navbarLayout;\n        \n                a.navbarTemplate = t7.compile(a.params.navbarTemplate ||\n                    '<div class=\"navbar {{#if navbarTheme}}theme-{{navbarTheme}}{{/if}}\">' +\n                        '<div class=\"navbar-inner\">' +\n                            '<div class=\"left sliding\">' +\n                                '{{#if material}}' +\n                                '<a href=\"#\" class=\"link {{#if inPopup}}close-popup{{else}}back{{/if}} icon-only\"><i class=\"icon icon-back\"></i></a>' +\n                                '{{else}}' +\n                                '<a href=\"#\" class=\"link {{#if inPopup}}close-popup{{else}}back{{/if}}\">' +\n                                    '<i class=\"icon icon-back\"></i>' +\n                                    '{{#if inPopup}}' +\n                                    '<span>{{popupCloseText}}</span>' +\n                                    '{{else}}' +\n                                    '<span>{{backText}}</span>' +\n                                    '{{/if}}' +\n                                '</a>' +\n                                '{{/if}}' +\n                            '</div>' +\n                            '<div class=\"center sliding\">{{pageTitle}}</div>' +\n                            '{{#if preloader}}' +\n                            '<div class=\"right\">' +\n                                '<div class=\"autocomplete-preloader preloader {{#if preloaderColor}}preloader-{{preloaderColor}}{{/if}}\"></div>' +\n                            '</div>' +\n                            '{{/if}}' +\n                        '</div>' +\n                    '</div>'\n                );\n                navbarHTML = a.navbarTemplate({\n                    pageTitle: pageTitle,\n                    backText: a.params.backText,\n                    popupCloseText: a.params.popupCloseText,\n                    openIn: a.params.openIn,\n                    navbarTheme: navbarTheme,\n                    inPopup: a.params.openIn === 'popup',\n                    inPage: a.params.openIn === 'page',\n                    material: material,\n                    preloader: a.params.preloader,\n                    preloaderColor: a.params.preloaderColor,\n                });\n        \n                // Determine navbar layout type - static/fixed/through\n                if (a.params.openIn === 'page') {\n                    navbarLayout = 'static';\n                    if (a.opener) {\n                        if (a.opener.parents('.navbar-through').length > 0) navbarLayout = 'through';\n                        if (a.opener.parents('.navbar-fixed').length > 0) navbarLayout = 'fixed';\n                        noToolbar = a.opener.parents('.page').hasClass('no-toolbar') ? 'no-toolbar' : '';\n                        noNavbar  = a.opener.parents('.page').hasClass('no-navbar')  ? 'no-navbar'  : 'navbar-' + navbarLayout;\n                    }\n                    else if (view.container) {\n                        if ($(view.container).hasClass('navbar-through') || $(view.container).find('.navbar-through').length > 0) navbarLayout = 'through';\n                        if ($(view.container).hasClass('navbar-fixed') || $(view.container).find('.navbar-fixed').length > 0) navbarLayout = 'fixed';\n                        noToolbar = $(view.activePage.container).hasClass('no-toolbar') ? 'no-toolbar' : '';\n                        noNavbar  = $(view.activePage.container).hasClass('no-navbar')  ? 'no-navbar'  : 'navbar-' + navbarLayout;\n                    }\n                }\n                else {\n                    navbarLayout = 'fixed';\n                }\n                var searchbarHTML =\n                    '<form class=\"searchbar\">' +\n                        '<div class=\"searchbar-input\">' +\n                            '<input type=\"search\" placeholder=\"' + a.params.searchbarPlaceholderText + '\">' +\n                            '<a href=\"#\" class=\"searchbar-clear\"></a>' +\n                        '</div>' +\n                        (material ? '' : '<a href=\"#\" class=\"searchbar-cancel\">' + a.params.searchbarCancelText + '</a>') +\n                    '</form>' +\n                    '<div class=\"searchbar-overlay\"></div>';\n                var pageHTML =\n                    (navbarLayout === 'through' ? navbarHTML : '') +\n                    '<div class=\"pages\">' +\n                        '<div data-page=\"' + pageName + '\" class=\"page autocomplete-page ' + noNavbar + ' ' + noToolbar + '\">' +\n                            (navbarLayout === 'fixed' ? navbarHTML : '') +\n                            searchbarHTML +\n                            '<div class=\"page-content\">' +\n                                (navbarLayout === 'static' ? navbarHTML : '') +\n                                '<div class=\"list-block autocomplete-found autocomplete-list-' + a.id + ' ' + (formTheme ? 'theme-' + formTheme : '') + '\">' +\n                                    '<ul></ul>' +\n                                '</div>' +\n                                '<div class=\"list-block autocomplete-not-found\">' +\n                                    '<ul><li class=\"item-content\"><div class=\"item-inner\"><div class=\"item-title\">' + a.params.notFoundText + '</div></div></li></ul>' +\n                                '</div>' +\n                                '<div class=\"list-block autocomplete-values\">' +\n                                    '<ul></ul>' +\n                                '</div>' +\n                            '</div>' +\n                        '</div>' +\n                    '</div>';\n            }\n            else {\n                a.dropdownItemTemplate = t7.compile(a.params.dropdownItemTemplate ||\n                    '<li>' +\n                        '<label class=\"{{#unless placeholder}}label-radio{{/unless}} item-content\" data-value=\"{{value}}\">' +\n                            '<div class=\"item-inner\">' +\n                                '<div class=\"item-title\">{{text}}</div>' +\n                            '</div>' +\n                        '</label>' +\n                    '</li>'\n                );\n                a.dropdownPlaceholderTemplate = t7.compile(a.params.dropdownPlaceholderTemplate ||\n                    '<li class=\"autocomplete-dropdown-placeholder\">' +\n                        '<div class=\"item-content\">' +\n                            '<div class=\"item-inner\">' +\n                                '<div class=\"item-title\">{{text}}</div>' +\n                            '</div>' +\n                        '</label>' +\n                    '</li>'\n                );\n                a.dropdownTemplate = t7.compile(a.params.dropdownTemplate ||\n                    '<div class=\"autocomplete-dropdown\">' +\n                        '<div class=\"autocomplete-dropdown-inner\">' +\n                            '<div class=\"list-block\">' +\n                                '<ul></ul>' +\n                            '</div>' +\n                        '</div>' +\n                        '{{#if preloader}}' +\n                        '<div class=\"autocomplete-preloader preloader {{#if preloaderColor}}preloader-{{preloaderColor}}{{/if}}\">{{#if material}}{{materialPreloaderHtml}}{{/if}}</div>' +\n                        '{{/if}}' +\n                    '</div>'\n                );\n            }\n        \n            // Define popup\n            a.popup = undefined;\n        \n            // Define Dropdown\n            a.dropdown = undefined;\n        \n            // Handle Input Value Change\n            function handleInputValue (e) {\n                var query = a.input.val();\n                if (a.params.source) {\n                    a.params.source(a, query, function (items) {\n                        var itemsHTML = '';\n                        var limit = a.params.limit ? Math.min(a.params.limit, items.length) : items.length;\n                        a.items = items;\n                        var i, j;\n                        var regExp = new RegExp('('+query+')', 'i');\n                        for (i = 0; i < limit; i++) {\n                            var itemValue = typeof items[i] === 'object' ? items[i][a.params.valueProperty] : items[i];\n                            itemsHTML += a.dropdownItemTemplate({\n                                value: itemValue,\n                                text: (typeof items[i] !== 'object' ? items[i] : items[i][a.params.textProperty]).replace(regExp, '<b>$1</b>')\n                            });\n                        }\n                        if (itemsHTML === '' && query === '' && a.params.dropdownPlaceholderText) {\n                            itemsHTML += a.dropdownPlaceholderTemplate({\n                                text: a.params.dropdownPlaceholderText,\n                            });\n                        }\n                        a.dropdown.find('ul').html(itemsHTML);\n                    });\n                }\n            }\n            // Handle Drop Down Click\n            function handleDropdownClick (e) {\n                /*jshint validthis:true */\n                var clicked = $(this);\n                var clickedItem;\n                for (var i = 0; i < a.items.length; i++) {\n                    var itemValue = typeof a.items[i] === 'object' ? a.items[i][a.params.valueProperty] : a.items[i];\n                    var value = clicked.attr('data-value');\n                    if (itemValue === value || itemValue * 1 === value * 1) {\n                        clickedItem = a.items[i];\n                    }\n                }\n                if (a.params.updateInputValueOnSelect) {\n                    a.input.val(typeof clickedItem === 'object' ? clickedItem[a.params.textProperty] : clickedItem);\n                    a.input.trigger('input change');\n                }\n        \n                if (a.params.onChange) {\n                    a.params.onChange(a, clickedItem);\n                }\n        \n                a.close();\n            }\n        \n            // Handle HTML Click to close Dropdown\n            function closeOnHTMLClick (e) {\n                var target = $(e.target);\n                if (!(target.is(a.input[0]) || a.dropdown && target.parents(a.dropdown[0]).length > 0)) {\n                    a.close();\n                }\n            }\n        \n            a.positionDropDown = function () {\n                var listBlock = a.input.parents('.list-block'),\n                    pageContent = a.input.parents('.page-content'),\n                    paddingTop = parseInt(pageContent.css('padding-top'), 10),\n                    paddingBottom = parseInt(pageContent.css('padding-top'), 10),\n                    // inputOffset = a.input.offset(),\n                    listBlockOffsetLeft = listBlock.length > 0 ? listBlock.offset().left - listBlock.parent().offset().left : 0,\n                    inputOffsetLeft = a.input.offset().left - (listBlock.length > 0 ? listBlock.offset().left : 0),\n                    inputOffsetTop = a.input.offset().top - (pageContent.offset().top - pageContent[0].scrollTop),\n                    maxHeight = pageContent[0].scrollHeight - paddingBottom - (inputOffsetTop + pageContent[0].scrollTop) - a.input[0].offsetHeight;\n        \n                a.dropdown.css({\n                    left: (listBlock.length > 0 ? listBlockOffsetLeft : inputOffsetLeft) + 'px',\n                    top: inputOffsetTop + pageContent[0].scrollTop + a.input[0].offsetHeight + 'px',\n                    width: (listBlock.length > 0 ? listBlock[0].offsetWidth : a.input[0].offsetWidth) + 'px'\n                });\n                a.dropdown.children('.autocomplete-dropdown-inner').css({\n                    maxHeight: maxHeight + 'px',\n                    paddingLeft: listBlock.length > 0 && !a.params.expandInput ? inputOffsetLeft - (material ? 16 : 15) + 'px' : ''\n                });\n            };\n        \n            // Event Listeners on new page\n            a.pageInit = function (e) {\n                var page = e.detail.page;\n                a.page = $(page.container);\n                a.pageData = page;\n                if (page.name !== pageName) {\n                    return;\n                }\n                var container = $(page.container);\n                // Init Search Bar\n                var searchbar = app.searchbar(container.find('.searchbar'), {\n                    customSearch: true,\n                    onSearch: function (searchbar, data) {\n                        if (data.query.length === 0 && searchbar.active) {\n                            searchbar.overlay.addClass('searchbar-overlay-active');\n                        }\n                        else {\n                            searchbar.overlay.removeClass('searchbar-overlay-active');\n                        }\n        \n                        var i, j, k;\n        \n                        if (a.params.source) {\n                            a.params.source(a, data.query, function(items) {\n                                var itemsHTML = '';\n                                var limit = a.params.limit ? Math.min(a.params.limit, items.length) : items.length;\n                                a.items = items;\n                                for (i = 0; i < limit; i++) {\n                                    var selected = false;\n                                    var itemValue = typeof items[i] === 'object' ? items[i][a.params.valueProperty] : items[i];\n                                    for (j = 0; j < a.value.length; j++) {\n                                        var aValue = typeof a.value[j] === 'object' ? a.value[j][a.params.valueProperty] : a.value[j];\n                                        if (aValue === itemValue || aValue * 1 === itemValue * 1) selected = true;\n                                    }\n                                    itemsHTML += a.itemTemplate({\n                                        value: itemValue,\n                                        text: typeof items[i] !== 'object' ? items[i] : items[i][a.params.textProperty],\n                                        inputType: a.inputType,\n                                        id: a.id,\n                                        inputName: a.inputName,\n                                        selected: selected,\n                                        checkbox: a.inputType === 'checkbox',\n                                        material: material\n                                    });\n                                }\n                                container.find('.autocomplete-found ul').html(itemsHTML);\n                                if (items.length === 0) {\n                                    if (data.query.length !== 0) {\n                                        container.find('.autocomplete-not-found').show();\n                                        container.find('.autocomplete-found, .autocomplete-values').hide();\n                                    }\n                                    else {\n                                        container.find('.autocomplete-values').show();\n                                        container.find('.autocomplete-found, .autocomplete-not-found').hide();\n                                    }\n                                }\n                                else {\n                                    container.find('.autocomplete-found').show();\n                                    container.find('.autocomplete-not-found, .autocomplete-values').hide();\n                                }\n                            });\n                        }\n                    }\n                });\n        \n                // Save searchbar instance\n                a.searchbar = searchbar;\n        \n                // Update values\n                function updateValues() {\n                    var valuesHTML = '';\n                    var i;\n                    for (i = 0; i < a.value.length; i++) {\n        \n                        valuesHTML += a.itemTemplate({\n                            value: typeof a.value[i] === 'object' ? a.value[i][a.params.valueProperty] : a.value[i],\n                            text: typeof a.value[i] === 'object' ? a.value[i][a.params.textProperty]: a.value[i],\n                            inputType: a.inputType,\n                            id: a.id,\n                            inputName: a.inputName + '-checked',\n                            checkbox: a.inputType === 'checkbox',\n                            material: material,\n                            selected: true\n                        });\n                    }\n                    container.find('.autocomplete-values ul').html(valuesHTML);\n                }\n        \n                // Handle Inputs\n                container.on('change', 'input[type=\"radio\"], input[type=\"checkbox\"]', function () {\n                    var i;\n                    var input = this;\n                    var value = input.value;\n                    var text = $(input).parents('li').find('.item-title').text();\n                    var isValues = $(input).parents('.autocomplete-values').length > 0;\n                    var item, itemValue, aValue;\n                    if (isValues) {\n                        if (a.inputType === 'checkbox' && !input.checked) {\n                            for (i = 0; i < a.value.length; i++) {\n                                aValue = typeof a.value[i] === 'string' ? a.value[i] : a.value[i][a.params.valueProperty];\n                                if (aValue === value || aValue * 1 === value * 1) {\n                                    a.value.splice(i, 1);\n                                }\n                            }\n                            updateValues();\n                            if (a.params.onChange) a.params.onChange(a, a.value);\n                        }\n                        return;\n                    }\n        \n                    // Find Related Item\n                    for (i = 0; i < a.items.length; i++) {\n                        itemValue = typeof a.items[i] === 'string' ? a.items[i] : a.items[i][a.params.valueProperty];\n                        if (itemValue === value || itemValue * 1 === value * 1) item = a.items[i];\n                    }\n                    // Update Selected Value\n                    if (a.inputType === 'radio') {\n                        a.value = [item];\n                    }\n                    else {\n                        if (input.checked) {\n                            a.value.push(item);\n                        }\n                        else {\n                            for (i = 0; i < a.value.length; i++) {\n                                aValue = typeof a.value[i] === 'string' ? a.value[i] : a.value[i][a.params.valueProperty];\n                                if (aValue === value || aValue * 1 === value * 1) {\n                                    a.value.splice(i, 1);\n                                }\n                            }\n                        }\n                    }\n        \n                    // Update Values Block\n                    updateValues();\n        \n                    // On Select Callback\n                    if ((a.inputType === 'radio' && input.checked || a.inputType === 'checkbox') && a.params.onChange ) {\n                        a.params.onChange(a, a.value);\n                    }\n                    if (backOnSelect && a.inputType === 'radio') {\n                        if (a.params.openIn === 'popup') app.closeModal(a.popup);\n                        else view.router.back();\n                    }\n                });\n        \n                // Update Values On Page Init\n                updateValues();\n        \n                if (a.params.onOpen) a.params.onOpen(a);\n            };\n        \n            // Show Hide Preloader\n            a.showPreloader = function () {\n                if (a.params.openIn === 'dropdown') {\n                    if (a.dropdown) a.dropdown.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');\n                }\n                else $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');\n            };\n        \n            a.hidePreloader = function () {\n                if (a.params.openIn === 'dropdown') {\n                    if (a.dropdown) a.dropdown.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');\n                }\n                else $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');\n            };\n        \n            // Open Autocomplete Page/Popup\n            a.open = function () {\n                if (a.opened) return;\n                a.opened = true;\n                if (a.params.openIn === 'dropdown') {\n                    if (!a.dropdown) {\n                        a.dropdown = $(a.dropdownTemplate({\n                            preloader: a.params.preloader,\n                            preloaderColor: a.params.preloaderColor,\n                            material: material,\n                            materialPreloaderHtml: app.params.materialPreloaderHtml\n                        }));\n                        a.dropdown.on('click', 'label', handleDropdownClick);\n        \n                    }\n                    var listBlock = a.input.parents('.list-block');\n                    if (listBlock.length && a.input.parents('.item-content').length > 0 && a.params.expandInput) {\n                        a.input.parents('.item-content').addClass('item-content-dropdown-expand');\n                    }\n                    a.positionDropDown();\n                    a.input.parents('.page-content').append(a.dropdown);\n                    a.dropdown.addClass('autocomplete-dropdown-in');\n                    a.input.trigger('input');\n                    $(window).on('resize', a.positionDropDown);\n                    if (a.params.onOpen) a.params.onOpen(a);\n                }\n                else {\n                    $(document).once('pageInit', '.autocomplete-page', a.pageInit);\n                    if (a.params.openIn === 'popup') {\n                        a.popup = app.popup(\n                            '<div class=\"popup autocomplete-popup autocomplete-popup-' + a.inputName + '\">' +\n                                '<div class=\"view navbar-fixed\">' +\n                                    pageHTML +\n                                '</div>' +\n                            '</div>'\n                            );\n                        a.popup = $(a.popup);\n                        a.popup.once('closed', function () {\n                            a.popup = undefined;\n                            a.opened = false;\n                            if (a.params.onClose) a.params.onClose(a);\n                        });\n                    }\n                    else {\n                        view.router.load({\n                            content: pageHTML\n                        });\n                        $(document).once('pageBack', '.autocomplete-page', function () {\n                            a.opened = false;\n                            if (a.params.onClose) a.params.onClose(a);\n                        });\n                    }\n                }\n            };\n            a.close = function (e) {\n                if (!a.opened) return;\n                if (a.params.openIn === 'dropdown') {\n                    if (e && e.type === 'blur' && a.dropdown.find('label.active-state').length > 0) return;\n                    a.dropdown.removeClass('autocomplete-dropdown-in').remove();\n                    a.input.parents('.item-content-dropdown-expand').removeClass('item-content-dropdown-expand');\n                    a.opened = false;\n                    $(window).off('resize', a.positionDropDown);\n                    if (a.params.onClose) a.params.onClose(a);\n                }\n                if (a.params.openIn === 'popup') {\n                    if (a.popup) app.closeModal(a.popup);\n                }\n            };\n        \n            // Init Events\n            a.initEvents = function (detach) {\n                var method = detach ? 'off' : 'on';\n                if (a.params.openIn !== 'dropdown' && a.opener) {\n                    a.opener[method]('click', a.open);\n                }\n                if (a.params.openIn === 'dropdown' && a.input) {\n                    a.input[method]('focus', a.open);\n                    a.input[method]('input', handleInputValue);\n                    if (app.device.android) {\n                        $('html')[method]('click', closeOnHTMLClick);\n                    }\n                    else {\n                        a.input[method]('blur', a.close);\n                    }\n                }\n                if (detach && a.dropdown) {\n                    a.dropdown = null;\n                }\n            };\n        \n            // Init/Destroy Methods\n            a.init = function () {\n                a.initEvents();\n            };\n            a.destroy = function () {\n                a.initEvents(true);\n                a = null;\n            };\n        \n            // Init\n            a.init();\n        \n            return a;\n        };\n        app.autocomplete = function (params) {\n            return new Autocomplete(params);\n        };\n\n        /*======================================================\n        ************   Picker   ************\n        ======================================================*/\n        var Picker = function (params) {\n            var p = this;\n            var defaults = {\n                updateValuesOnMomentum: false,\n                updateValuesOnTouchmove: true,\n                rotateEffect: false,\n                momentumRatio: 7,\n                freeMode: false,\n                // Common settings\n                closeByOutsideClick: true,\n                scrollToInput: true,\n                inputReadOnly: true,\n                convertToPopover: true,\n                onlyInPopover: false,\n                toolbar: true,\n                toolbarCloseText: 'Done',\n                toolbarTemplate: \n                    '<div class=\"toolbar\">' +\n                        '<div class=\"toolbar-inner\">' +\n                            '<div class=\"left\"></div>' +\n                            '<div class=\"right\">' +\n                                '<a href=\"#\" class=\"link close-picker\">{{closeText}}</a>' +\n                            '</div>' +\n                        '</div>' +\n                    '</div>'\n            };\n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined') {\n                    params[def] = defaults[def];\n                }\n            }\n            p.params = params;\n            p.cols = [];\n            p.initialized = false;\n            \n            // Inline flag\n            p.inline = p.params.container ? true : false;\n        \n            // 3D Transforms origin bug, only on safari\n            var originBug = app.device.ios || (navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !app.device.android;\n        \n            // Should be converted to popover\n            function isPopover() {\n                var toPopover = false;\n                if (!p.params.convertToPopover && !p.params.onlyInPopover) return toPopover;\n                if (!p.inline && p.params.input) {\n                    if (p.params.onlyInPopover) toPopover = true;\n                    else {\n                        if (app.device.ios) {\n                            toPopover = app.device.ipad ? true : false;\n                        }\n                        else {\n                            if ($(window).width() >= 768) toPopover = true;\n                        }\n                    }\n                } \n                return toPopover; \n            }\n            function inPopover() {\n                if (p.opened && p.container && p.container.length > 0 && p.container.parents('.popover').length > 0) return true;\n                else return false;\n            }\n        \n            // Value\n            p.setValue = function (arrValues, transition) {\n                var valueIndex = 0;\n                if (p.cols.length === 0) {\n                    p.value = arrValues;\n                    p.updateValue(arrValues);\n                    return;\n                }\n                for (var i = 0; i < p.cols.length; i++) {\n                    if (p.cols[i] && !p.cols[i].divider) {\n                        p.cols[i].setValue(arrValues[valueIndex], transition);\n                        valueIndex++;\n                    }\n                }\n            };\n            p.updateValue = function (forceValues) {\n                var newValue = forceValues || [];\n                var newDisplayValue = [];\n                for (var i = 0; i < p.cols.length; i++) {\n                    if (!p.cols[i].divider) {\n                        newValue.push(p.cols[i].value);\n                        newDisplayValue.push(p.cols[i].displayValue);\n                    }\n                }\n                if (newValue.indexOf(undefined) >= 0) {\n                    return;\n                }\n                p.value = newValue;\n                p.displayValue = newDisplayValue;\n                if (p.params.onChange) {\n                    p.params.onChange(p, p.value, p.displayValue);\n                }\n                if (p.input && p.input.length > 0) {\n                    $(p.input).val(p.params.formatValue ? p.params.formatValue(p, p.value, p.displayValue) : p.value.join(' '));\n                    $(p.input).trigger('change');\n                }\n            };\n        \n            // Columns Handlers\n            p.initPickerCol = function (colElement, updateItems) {\n                var colContainer = $(colElement);\n                var colIndex = colContainer.index();\n                var col = p.cols[colIndex];\n                if (col.divider) return;\n                col.container = colContainer;\n                col.wrapper = col.container.find('.picker-items-col-wrapper');\n                col.items = col.wrapper.find('.picker-item');\n                \n                var i, j;\n                var wrapperHeight, itemHeight, itemsHeight, minTranslate, maxTranslate;\n                col.replaceValues = function (values, displayValues) {\n                    col.destroyEvents();\n                    col.values = values;\n                    col.displayValues = displayValues;\n                    var newItemsHTML = p.columnHTML(col, true);\n                    col.wrapper.html(newItemsHTML);\n                    col.items = col.wrapper.find('.picker-item');\n                    col.calcSize();\n                    col.setValue(col.values[0], 0, true);\n                    col.initEvents();\n                };\n                col.calcSize = function () {\n                    if (p.params.rotateEffect) {\n                        col.container.removeClass('picker-items-col-absolute');\n                        if (!col.width) col.container.css({width:''});\n                    }\n                    var colWidth, colHeight;\n                    colWidth = 0;\n                    colHeight = col.container[0].offsetHeight;\n                    wrapperHeight = col.wrapper[0].offsetHeight;\n                    itemHeight = col.items[0].offsetHeight;\n                    itemsHeight = itemHeight * col.items.length;\n                    minTranslate = colHeight / 2 - itemsHeight + itemHeight / 2;\n                    maxTranslate = colHeight / 2 - itemHeight / 2;    \n                    if (col.width) {\n                        colWidth = col.width;\n                        if (parseInt(colWidth, 10) === colWidth) colWidth = colWidth + 'px';\n                        col.container.css({width: colWidth});\n                    }\n                    if (p.params.rotateEffect) {\n                        if (!col.width) {\n                            col.items.each(function () {\n                                var item = $(this);\n                                item.css({width:'auto'});\n                                colWidth = Math.max(colWidth, item[0].offsetWidth);\n                                item.css({width:''});\n                            });\n                            col.container.css({width: (colWidth + 2) + 'px'});\n                        }\n                        col.container.addClass('picker-items-col-absolute');\n                    }\n                };\n                col.calcSize();\n                \n                col.wrapper.transform('translate3d(0,' + maxTranslate + 'px,0)').transition(0);\n        \n        \n                var activeIndex = 0;\n                var animationFrameId;\n        \n                // Set Value Function\n                col.setValue = function (newValue, transition, valueCallbacks) {\n                    if (typeof transition === 'undefined') transition = '';\n                    var newActiveIndex = col.wrapper.find('.picker-item[data-picker-value=\"' + newValue + '\"]').index();\n                    if(typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {\n                        return;\n                    }\n                    var newTranslate = -newActiveIndex * itemHeight + maxTranslate;\n                    // Update wrapper\n                    col.wrapper.transition(transition);\n                    col.wrapper.transform('translate3d(0,' + (newTranslate) + 'px,0)');\n                        \n                    // Watch items\n                    if (p.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex ) {\n                        $.cancelAnimationFrame(animationFrameId);\n                        col.wrapper.transitionEnd(function(){\n                            $.cancelAnimationFrame(animationFrameId);\n                        });\n                        updateDuringScroll();\n                    }\n        \n                    // Update items\n                    col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);\n                };\n        \n                col.updateItems = function (activeIndex, translate, transition, valueCallbacks) {\n                    if (typeof translate === 'undefined') {\n                        translate = $.getTranslate(col.wrapper[0], 'y');\n                    }\n                    if(typeof activeIndex === 'undefined') activeIndex = -Math.round((translate - maxTranslate)/itemHeight);\n                    if (activeIndex < 0) activeIndex = 0;\n                    if (activeIndex >= col.items.length) activeIndex = col.items.length - 1;\n                    var previousActiveIndex = col.activeIndex;\n                    col.activeIndex = activeIndex;\n                    col.wrapper.find('.picker-selected').removeClass('picker-selected');\n        \n                    col.items.transition(transition);\n                    \n                    var selectedItem = col.items.eq(activeIndex).addClass('picker-selected').transform('');\n                        \n                    // Set 3D rotate effect\n                    if (p.params.rotateEffect) {\n                        var percentage = (translate - (Math.floor((translate - maxTranslate)/itemHeight) * itemHeight + maxTranslate)) / itemHeight;\n                        \n                        col.items.each(function () {\n                            var item = $(this);\n                            var itemOffsetTop = item.index() * itemHeight;\n                            var translateOffset = maxTranslate - translate;\n                            var itemOffset = itemOffsetTop - translateOffset;\n                            var percentage = itemOffset / itemHeight;\n        \n                            var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;\n                            \n                            var angle = (-18*percentage);\n                            if (angle > 180) angle = 180;\n                            if (angle < -180) angle = -180;\n                            // Far class\n                            if (Math.abs(percentage) > itemsFit) item.addClass('picker-item-far');\n                            else item.removeClass('picker-item-far');\n                            // Set transform\n                            item.transform('translate3d(0, ' + (-translate + maxTranslate) + 'px, ' + (originBug ? -110 : 0) + 'px) rotateX(' + angle + 'deg)');\n                        });\n                    }\n        \n                    if (valueCallbacks || typeof valueCallbacks === 'undefined') {\n                        // Update values\n                        col.value = selectedItem.attr('data-picker-value');\n                        col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;\n                        // On change callback\n                        if (previousActiveIndex !== activeIndex) {\n                            if (col.onChange) {\n                                col.onChange(p, col.value, col.displayValue);\n                            }\n                            p.updateValue();\n                        }\n                    }\n                };\n        \n                function updateDuringScroll() {\n                    animationFrameId = $.requestAnimationFrame(function () {\n                        col.updateItems(undefined, undefined, 0);\n                        updateDuringScroll();\n                    });\n                }\n        \n                // Update items on init\n                if (updateItems) col.updateItems(0, maxTranslate, 0);\n        \n                var allowItemClick = true;\n                var isTouched, isMoved, touchStartY, touchCurrentY, touchStartTime, touchEndTime, startTranslate, returnTo, currentTranslate, prevTranslate, velocityTranslate, velocityTime;\n                function handleTouchStart (e) {\n                    if (isMoved || isTouched) return;\n                    e.preventDefault();\n                    isTouched = true;\n                    touchStartY = touchCurrentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                    touchStartTime = (new Date()).getTime();\n                    \n                    allowItemClick = true;\n                    startTranslate = currentTranslate = $.getTranslate(col.wrapper[0], 'y');\n                }\n                function handleTouchMove (e) {\n                    if (!isTouched) return;\n                    e.preventDefault();\n                    allowItemClick = false;\n                    touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                    if (!isMoved) {\n                        // First move\n                        $.cancelAnimationFrame(animationFrameId);\n                        isMoved = true;\n                        startTranslate = currentTranslate = $.getTranslate(col.wrapper[0], 'y');\n                        col.wrapper.transition(0);\n                    }\n        \n                    var diff = touchCurrentY - touchStartY;\n                    currentTranslate = startTranslate + diff;\n                    returnTo = undefined;\n        \n                    // Normalize translate\n                    if (currentTranslate < minTranslate) {\n                        currentTranslate = minTranslate - Math.pow(minTranslate - currentTranslate, 0.8);\n                        returnTo = 'min';\n                    }\n                    if (currentTranslate > maxTranslate) {\n                        currentTranslate = maxTranslate + Math.pow(currentTranslate - maxTranslate, 0.8);\n                        returnTo = 'max';\n                    }\n                    // Transform wrapper\n                    col.wrapper.transform('translate3d(0,' + currentTranslate + 'px,0)');\n        \n                    // Update items\n                    col.updateItems(undefined, currentTranslate, 0, p.params.updateValuesOnTouchmove);\n                    \n                    // Calc velocity\n                    velocityTranslate = currentTranslate - prevTranslate || currentTranslate;\n                    velocityTime = (new Date()).getTime();\n                    prevTranslate = currentTranslate;\n                }\n                function handleTouchEnd (e) {\n                    if (!isTouched || !isMoved) {\n                        isTouched = isMoved = false;\n                        return;\n                    }\n                    isTouched = isMoved = false;\n                    col.wrapper.transition('');\n                    if (returnTo) {\n                        if (returnTo === 'min') {\n                            col.wrapper.transform('translate3d(0,' + minTranslate + 'px,0)');\n                        }\n                        else col.wrapper.transform('translate3d(0,' + maxTranslate + 'px,0)');\n                    }\n                    touchEndTime = new Date().getTime();\n                    var velocity, newTranslate;\n                    if (touchEndTime - touchStartTime > 300) {\n                        newTranslate = currentTranslate;\n                    }\n                    else {\n                        velocity = Math.abs(velocityTranslate / (touchEndTime - velocityTime));\n                        newTranslate = currentTranslate + velocityTranslate * p.params.momentumRatio;\n                    }\n        \n                    newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);\n        \n                    // Active Index\n                    var activeIndex = -Math.floor((newTranslate - maxTranslate)/itemHeight);\n        \n                    // Normalize translate\n                    if (!p.params.freeMode) newTranslate = -activeIndex * itemHeight + maxTranslate;\n        \n                    // Transform wrapper\n                    col.wrapper.transform('translate3d(0,' + (parseInt(newTranslate,10)) + 'px,0)');\n        \n                    // Update items\n                    col.updateItems(activeIndex, newTranslate, '', true);\n        \n                    // Watch items\n                    if (p.params.updateValuesOnMomentum) {\n                        updateDuringScroll();\n                        col.wrapper.transitionEnd(function(){\n                            $.cancelAnimationFrame(animationFrameId);\n                        });\n                    }\n        \n                    // Allow click\n                    setTimeout(function () {\n                        allowItemClick = true;\n                    }, 100);\n                }\n        \n                function handleClick(e) {\n                    if (!allowItemClick) return;\n                    $.cancelAnimationFrame(animationFrameId);\n                    /*jshint validthis:true */\n                    var value = $(this).attr('data-picker-value');\n                    col.setValue(value);\n                }\n        \n                col.initEvents = function (detach) {\n                    var method = detach ? 'off' : 'on';\n                    col.container[method](app.touchEvents.start, handleTouchStart);\n                    col.container[method](app.touchEvents.move, handleTouchMove);\n                    col.container[method](app.touchEvents.end, handleTouchEnd);\n                    col.items[method]('click', handleClick);\n                };\n                col.destroyEvents = function () {\n                    col.initEvents(true);\n                };\n        \n                col.container[0].f7DestroyPickerCol = function () {\n                    col.destroyEvents();\n                };\n        \n                col.initEvents();\n        \n            };\n            p.destroyPickerCol = function (colContainer) {\n                colContainer = $(colContainer);\n                if ('f7DestroyPickerCol' in colContainer[0]) colContainer[0].f7DestroyPickerCol();\n            };\n            // Resize cols\n            function resizeCols() {\n                if (!p.opened) return;\n                for (var i = 0; i < p.cols.length; i++) {\n                    if (!p.cols[i].divider) {\n                        p.cols[i].calcSize();\n                        p.cols[i].setValue(p.cols[i].value, 0, false);\n                    }\n                }\n            }\n            $(window).on('resize', resizeCols);\n        \n            // HTML Layout\n            p.columnHTML = function (col, onlyItems) {\n                var columnItemsHTML = '';\n                var columnHTML = '';\n                if (col.divider) {\n                    columnHTML += '<div class=\"picker-items-col picker-items-col-divider ' + (col.textAlign ? 'picker-items-col-' + col.textAlign : '') + ' ' + (col.cssClass || '') + '\">' + col.content + '</div>';\n                }\n                else {\n                    for (var j = 0; j < col.values.length; j++) {\n                        columnItemsHTML += '<div class=\"picker-item\" data-picker-value=\"' + col.values[j] + '\">' + (col.displayValues ? col.displayValues[j] : col.values[j]) + '</div>';\n                    }\n                    columnHTML += '<div class=\"picker-items-col ' + (col.textAlign ? 'picker-items-col-' + col.textAlign : '') + ' ' + (col.cssClass || '') + '\"><div class=\"picker-items-col-wrapper\">' + columnItemsHTML + '</div></div>';\n                }\n                return onlyItems ? columnItemsHTML : columnHTML;\n            };\n            p.layout = function () {\n                var pickerHTML = '';\n                var pickerClass = '';\n                var i;\n                p.cols = [];\n                var colsHTML = '';\n                for (i = 0; i < p.params.cols.length; i++) {\n                    var col = p.params.cols[i];\n                    colsHTML += p.columnHTML(p.params.cols[i]);\n                    p.cols.push(col);\n                }\n                pickerClass = 'picker-modal picker-columns ' + (p.params.cssClass || '') + (p.params.rotateEffect ? ' picker-3d' : '');\n                pickerHTML =\n                    '<div class=\"' + (pickerClass) + '\">' +\n                        (p.params.toolbar ? p.params.toolbarTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText) : '') +\n                        '<div class=\"picker-modal-inner picker-items\">' +\n                            colsHTML +\n                            '<div class=\"picker-center-highlight\"></div>' +\n                        '</div>' +\n                    '</div>';\n                    \n                p.pickerHTML = pickerHTML;    \n            };\n        \n            // Input Events\n            function openOnInput(e) {\n                e.preventDefault();\n                if (p.opened) return;\n                p.open();\n                if (p.params.scrollToInput && !isPopover()) {\n                    var pageContent = p.input.parents('.page-content');\n                    if (pageContent.length === 0) return;\n        \n                    var paddingTop = parseInt(pageContent.css('padding-top'), 10),\n                        paddingBottom = parseInt(pageContent.css('padding-bottom'), 10),\n                        pageHeight = pageContent[0].offsetHeight - paddingTop - p.container.height(),\n                        pageScrollHeight = pageContent[0].scrollHeight - paddingTop - p.container.height(),\n                        newPaddingBottom;\n                    var inputTop = p.input.offset().top - paddingTop + p.input[0].offsetHeight;\n                    if (inputTop > pageHeight) {\n                        var scrollTop = pageContent.scrollTop() + inputTop - pageHeight;\n                        if (scrollTop + pageHeight > pageScrollHeight) {\n                            newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom;\n                            if (pageHeight === pageScrollHeight) {\n                                newPaddingBottom = p.container.height();\n                            }\n                            pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'});\n                        }\n                        pageContent.scrollTop(scrollTop, 300);\n                    }\n                }\n            }\n            function closeOnHTMLClick(e) {\n                if (inPopover()) return;\n                if (p.input && p.input.length > 0) {\n                    if (e.target !== p.input[0] && $(e.target).parents('.picker-modal').length === 0) p.close();\n                }\n                else {\n                    if ($(e.target).parents('.picker-modal').length === 0) p.close();   \n                }\n            }\n        \n            if (p.params.input) {\n                p.input = $(p.params.input);\n                if (p.input.length > 0) {\n                    if (p.params.inputReadOnly) p.input.prop('readOnly', true);\n                    if (!p.inline) {\n                        p.input.on('click', openOnInput);    \n                    }\n                    if (p.params.inputReadOnly) {\n                        p.input.on('focus mousedown', function (e) {\n                            e.preventDefault();\n                        });\n                    }\n                }\n                    \n            }\n            \n            if (!p.inline && p.params.closeByOutsideClick) $('html').on('click', closeOnHTMLClick);\n        \n            // Open\n            function onPickerClose() {\n                p.opened = false;\n                if (p.input && p.input.length > 0) {\n                    p.input.parents('.page-content').css({'padding-bottom': ''});\n                    if (app.params.material) p.input.trigger('blur');\n                }\n                if (p.params.onClose) p.params.onClose(p);\n        \n                // Destroy events\n                p.container.find('.picker-items-col').each(function () {\n                    p.destroyPickerCol(this);\n                });\n            }\n        \n            p.opened = false;\n            p.open = function () {\n                var toPopover = isPopover();\n        \n                if (!p.opened) {\n        \n                    // Layout\n                    p.layout();\n        \n                    // Append\n                    if (toPopover) {\n                        p.pickerHTML = '<div class=\"popover popover-picker-columns\"><div class=\"popover-inner\">' + p.pickerHTML + '</div></div>';\n                        p.popover = app.popover(p.pickerHTML, p.params.input, true);\n                        p.container = $(p.popover).find('.picker-modal');\n                        $(p.popover).on('close', function () {\n                            onPickerClose();\n                        });\n                    }\n                    else if (p.inline) {\n                        p.container = $(p.pickerHTML);\n                        p.container.addClass('picker-modal-inline');\n                        $(p.params.container).append(p.container);\n                    }\n                    else {\n                        p.container = $(app.pickerModal(p.pickerHTML));\n                        $(p.container)\n                        .on('close', function () {\n                            onPickerClose();\n                        });\n                    }\n        \n                    // Store picker instance\n                    p.container[0].f7Picker = p;\n        \n                    // Init Events\n                    p.container.find('.picker-items-col').each(function () {\n                        var updateItems = true;\n                        if ((!p.initialized && p.params.value) || (p.initialized && p.value)) updateItems = false;\n                        p.initPickerCol(this, updateItems);\n                    });\n                    \n                    // Set value\n                    if (!p.initialized) {\n                        if (p.value) p.setValue(p.value, 0);\n                        else if (p.params.value) {\n                            p.setValue(p.params.value, 0);\n                        }\n                    }\n                    else {\n                        if (p.value) p.setValue(p.value, 0);\n                    }\n        \n                    // Material Focus\n                    if (p.input && p.input.length > 0 && app.params.material) {\n                        p.input.trigger('focus');\n                    }\n                }\n        \n                // Set flag\n                p.opened = true;\n                p.initialized = true;\n        \n                if (p.params.onOpen) p.params.onOpen(p);\n            };\n        \n            // Close\n            p.close = function () {\n                if (!p.opened || p.inline) return;\n                if (inPopover()) {\n                    app.closeModal(p.popover);\n                    return;\n                }\n                else {\n                    app.closeModal(p.container);\n                    return;\n                }\n            };\n        \n            // Destroy\n            p.destroy = function () {\n                p.close();\n                if (p.params.input && p.input.length > 0) {\n                    p.input.off('click focus', openOnInput);\n                }\n                $('html').off('click', closeOnHTMLClick);\n                $(window).off('resize', resizeCols);\n            };\n        \n            if (p.inline) {\n                p.open();\n            }\n            else {\n                if (!p.initialized && p.params.value) p.setValue(p.params.value);\n            }\n        \n            return p;\n        };\n        app.picker = function (params) {\n            return new Picker(params);\n        };\n\n        /*======================================================\n        ************   Calendar   ************\n        ======================================================*/\n        var Calendar = function (params) {\n            var p = this;\n            var defaults = {\n                monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August' , 'September' , 'October', 'November', 'December'],\n                monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n                dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n                dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n                firstDay: 1, // First day of the week, Monday\n                weekendDays: [0, 6], // Sunday and Saturday\n                multiple: false,\n                rangePicker: false,\n                dateFormat: 'yyyy-mm-dd',\n                direction: 'horizontal', // or 'vertical'\n                minDate: null,\n                maxDate: null,\n                disabled: null, // dates range of disabled days\n                events: null, // dates range of days with events\n                rangesClasses: null, //array with custom classes date ranges\n                touchMove: true,\n                animate: true,\n                closeOnSelect: false,\n                monthPicker: true,\n                monthPickerTemplate:\n                    '<div class=\"picker-calendar-month-picker\">' +\n                        '<a href=\"#\" class=\"link icon-only picker-calendar-prev-month\"><i class=\"icon icon-prev\"></i></a>' +\n                        '<span class=\"current-month-value\"></span>' +\n                        '<a href=\"#\" class=\"link icon-only picker-calendar-next-month\"><i class=\"icon icon-next\"></i></a>' +\n                    '</div>',\n                yearPicker: true,\n                yearPickerTemplate:\n                    '<div class=\"picker-calendar-year-picker\">' +\n                        '<a href=\"#\" class=\"link icon-only picker-calendar-prev-year\"><i class=\"icon icon-prev\"></i></a>' +\n                        '<span class=\"current-year-value\"></span>' +\n                        '<a href=\"#\" class=\"link icon-only picker-calendar-next-year\"><i class=\"icon icon-next\"></i></a>' +\n                    '</div>',\n                weekHeader: true,\n                // Common settings\n                closeByOutsideClick: true,\n                scrollToInput: true,\n                inputReadOnly: true,\n                convertToPopover: true,\n                onlyInPopover: false,\n                toolbar: true,\n                toolbarCloseText: 'Done',\n                headerPlaceholder: 'Select date',\n                header: app.params.material,\n                footer: app.params.material,\n                toolbarTemplate:\n                    '<div class=\"toolbar\">' +\n                        '<div class=\"toolbar-inner\">' +\n                            '{{monthPicker}}' +\n                            '{{yearPicker}}' +\n                        '</div>' +\n                    '</div>',\n                headerTemplate:\n                    '<div class=\"picker-header\">' +\n                        '<div class=\"picker-calendar-selected-date\">{{placeholder}}</div>' +\n                    '</div>',\n                footerTemplate:\n                    '<div class=\"picker-footer\">' +\n                        '<a href=\"#\" class=\"button close-picker\">{{closeText}}</a>' +\n                    '</div>',\n        \n                /* Callbacks\n                onMonthAdd\n                onChange\n                onOpen\n                onClose\n                onDayClick\n                onMonthYearChangeStart\n                onMonthYearChangeEnd\n                */\n            };\n            params = params || {};\n            for (var def in defaults) {\n                if (typeof params[def] === 'undefined') {\n                    params[def] = defaults[def];\n                }\n            }\n            p.params = params;\n            p.initialized = false;\n        \n            // Inline flag\n            p.inline = p.params.container ? true : false;\n        \n            // Is horizontal\n            p.isH = p.params.direction === 'horizontal';\n        \n            // RTL inverter\n            var inverter = p.isH ? (app.rtl ? -1 : 1) : 1;\n        \n            // Animating flag\n            p.animating = false;\n        \n            // Should be converted to popover\n            function isPopover() {\n                var toPopover = false;\n                if (!p.params.convertToPopover && !p.params.onlyInPopover) return toPopover;\n                if (!p.inline && p.params.input) {\n                    if (p.params.onlyInPopover) toPopover = true;\n                    else {\n                        if (app.device.ios) {\n                            toPopover = app.device.ipad ? true : false;\n                        }\n                        else {\n                            if ($(window).width() >= 768) toPopover = true;\n                        }\n                    }\n                }\n                return toPopover;\n            }\n            function inPopover() {\n                if (p.opened && p.container && p.container.length > 0 && p.container.parents('.popover').length > 0) return true;\n                else return false;\n            }\n        \n            // Format date\n            function formatDate(date) {\n                date = new Date(date);\n                var year = date.getFullYear();\n                var month = date.getMonth();\n                var month1 = month + 1;\n                var day = date.getDate();\n                var weekDay = date.getDay();\n        \n                return p.params.dateFormat\n                    .replace(/yyyy/g, year)\n                    .replace(/yy/g, (year + '').substring(2))\n                    .replace(/mm/g, month1 < 10 ? '0' + month1 : month1)\n                    .replace(/m(\\W+)/g, month1 + '$1')\n                    .replace(/MM/g, p.params.monthNames[month])\n                    .replace(/M(\\W+)/g, p.params.monthNamesShort[month] + '$1')\n                    .replace(/dd/g, day < 10 ? '0' + day : day)\n                    .replace(/d(\\W+)/g, day + '$1')\n                    .replace(/DD/g, p.params.dayNames[weekDay])\n                    .replace(/D(\\W+)/g, p.params.dayNamesShort[weekDay] + '$1');\n            }\n        \n        \n            // Value\n            p.addValue = function (value) {\n                if (p.params.multiple) {\n                    if (!p.value) p.value = [];\n                    var inValuesIndex;\n                    for (var i = 0; i < p.value.length; i++) {\n                        if (new Date(value).getTime() === new Date(p.value[i]).getTime()) {\n                            inValuesIndex = i;\n                        }\n                    }\n                    if (typeof inValuesIndex === 'undefined') {\n                        p.value.push(value);\n                    }\n                    else {\n                        p.value.splice(inValuesIndex, 1);\n                    }\n                    p.updateValue();\n                }\n                else if (p.params.rangePicker) {\n                    if (!p.value) p.value = [];\n                    if (p.value.length === 2 || p.value.length === 0) {\n                        p.value = [];\n                    }\n                    if (p.value[0] !== value) p.value.push(value);\n                    else p.value = [];\n                    p.value.sort(function (a,b) {\n                        return a - b;\n                    });\n                    p.updateValue();\n                }\n                else {\n                    p.value = [value];\n                    p.updateValue();\n                }\n            };\n            p.setValue = function (arrValues) {\n                p.value = arrValues;\n                p.updateValue();\n            };\n            p.updateValue = function (onlyHeader) {\n                var i, inputValue;\n                if (p.container && p.container.length > 0) {\n                    p.wrapper.find('.picker-calendar-day-selected').removeClass('picker-calendar-day-selected');\n                    var valueDate;\n                    if (p.params.rangePicker && p.value.length === 2) {\n                        for (i = p.value[0]; i <= p.value[1]; i += 24*60*60*1000) {\n                            valueDate = new Date(i);\n                            p.wrapper.find('.picker-calendar-day[data-date=\"' + valueDate.getFullYear() + '-' + valueDate.getMonth() + '-' + valueDate.getDate() + '\"]').addClass('picker-calendar-day-selected');\n                        }\n                    }\n                    else {\n                        for (i = 0; i < p.value.length; i++) {\n                            valueDate = new Date(p.value[i]);\n                            p.wrapper.find('.picker-calendar-day[data-date=\"' + valueDate.getFullYear() + '-' + valueDate.getMonth() + '-' + valueDate.getDate() + '\"]').addClass('picker-calendar-day-selected');\n                        }\n                    }\n                }\n        \n                if (p.params.onChange) {\n                    p.params.onChange(p, p.value);\n                }\n                if ((p.input && p.input.length > 0) || (app.params.material && p.params.header)) {\n                    if (p.params.formatValue) inputValue = p.params.formatValue(p, p.value);\n                    else {\n                        inputValue = [];\n                        for (i = 0; i < p.value.length; i++) {\n                            inputValue.push(formatDate(p.value[i]));\n                        }\n                        inputValue = inputValue.join(p.params.rangePicker ? ' - ' : ', ');\n                    }\n                    if (app.params.material && p.params.header && p.container && p.container.length > 0) {\n                        p.container.find('.picker-calendar-selected-date').text(inputValue);\n                    }\n                    if (p.input && p.input.length > 0 && !onlyHeader) {\n                        $(p.input).val(inputValue);\n                        $(p.input).trigger('change');\n                    }\n        \n                }\n            };\n        \n            // Columns Handlers\n            p.initCalendarEvents = function () {\n                var col;\n                var allowItemClick = true;\n                var isTouched, isMoved, touchStartX, touchStartY, touchCurrentX, touchCurrentY, touchStartTime, touchEndTime, startTranslate, currentTranslate, wrapperWidth, wrapperHeight, percentage, touchesDiff, isScrolling;\n                function handleTouchStart (e) {\n                    if (isMoved || isTouched) return;\n                    // e.preventDefault();\n                    isTouched = true;\n                    touchStartX = touchCurrentY = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n                    touchStartY = touchCurrentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n                    touchStartTime = (new Date()).getTime();\n                    percentage = 0;\n                    allowItemClick = true;\n                    isScrolling = undefined;\n                    startTranslate = currentTranslate = p.monthsTranslate;\n                }\n                function handleTouchMove (e) {\n                    if (!isTouched) return;\n        \n                    touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                    touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                    if (typeof isScrolling === 'undefined') {\n                        isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));\n                    }\n                    if (p.isH && isScrolling) {\n                        isTouched = false;\n                        return;\n                    }\n                    e.preventDefault();\n                    if (p.animating) {\n                        isTouched = false;\n                        return;\n                    }\n                    allowItemClick = false;\n                    if (!isMoved) {\n                        // First move\n                        isMoved = true;\n                        wrapperWidth = p.wrapper[0].offsetWidth;\n                        wrapperHeight = p.wrapper[0].offsetHeight;\n                        p.wrapper.transition(0);\n                    }\n        \n                    touchesDiff = p.isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;\n                    percentage = touchesDiff/(p.isH ? wrapperWidth : wrapperHeight);\n                    currentTranslate = (p.monthsTranslate * inverter + percentage) * 100;\n        \n                    // Transform wrapper\n                    p.wrapper.transform('translate3d(' + (p.isH ? currentTranslate : 0) + '%, ' + (p.isH ? 0 : currentTranslate) + '%, 0)');\n        \n                }\n                function handleTouchEnd (e) {\n                    if (!isTouched || !isMoved) {\n                        isTouched = isMoved = false;\n                        return;\n                    }\n                    isTouched = isMoved = false;\n        \n                    touchEndTime = new Date().getTime();\n                    if (touchEndTime - touchStartTime < 300) {\n                        if (Math.abs(touchesDiff) < 10) {\n                            p.resetMonth();\n                        }\n                        else if (touchesDiff >= 10) {\n                            if (app.rtl) p.nextMonth();\n                            else p.prevMonth();\n                        }\n                        else {\n                            if (app.rtl) p.prevMonth();\n                            else p.nextMonth();\n                        }\n                    }\n                    else {\n                        if (percentage <= -0.5) {\n                            if (app.rtl) p.prevMonth();\n                            else p.nextMonth();\n                        }\n                        else if (percentage >= 0.5) {\n                            if (app.rtl) p.nextMonth();\n                            else p.prevMonth();\n                        }\n                        else {\n                            p.resetMonth();\n                        }\n                    }\n        \n                    // Allow click\n                    setTimeout(function () {\n                        allowItemClick = true;\n                    }, 100);\n                }\n        \n                function handleDayClick(e) {\n                    if (!allowItemClick) return;\n                    var day = $(e.target).parents('.picker-calendar-day');\n                    if (day.length === 0 && $(e.target).hasClass('picker-calendar-day')) {\n                        day = $(e.target);\n                    }\n                    if (day.length === 0) return;\n                    if (day.hasClass('picker-calendar-day-selected') && !(p.params.multiple || p.params.rangePicker)) return;\n                    if (day.hasClass('picker-calendar-day-disabled')) return;\n                    if (!p.params.rangePicker) {\n                        if (day.hasClass('picker-calendar-day-next')) p.nextMonth();\n                        if (day.hasClass('picker-calendar-day-prev')) p.prevMonth();\n                    }\n                    var dateYear = day.attr('data-year');\n                    var dateMonth = day.attr('data-month');\n                    var dateDay = day.attr('data-day');\n                    if (p.params.onDayClick) {\n                        p.params.onDayClick(p, day[0], dateYear, dateMonth, dateDay);\n                    }\n                    p.addValue(new Date(dateYear, dateMonth, dateDay).getTime());\n                    if (p.params.closeOnSelect) {\n                        if (p.params.rangePicker && p.value.length === 2 || !p.params.rangePicker) p.close();\n                    }\n                }\n        \n                p.container.find('.picker-calendar-prev-month').on('click', p.prevMonth);\n                p.container.find('.picker-calendar-next-month').on('click', p.nextMonth);\n                p.container.find('.picker-calendar-prev-year').on('click', p.prevYear);\n                p.container.find('.picker-calendar-next-year').on('click', p.nextYear);\n                p.wrapper.on('click', handleDayClick);\n                var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? {passive: true, capture: false} : false;\n                if (p.params.touchMove) {\n                    p.wrapper.on(app.touchEvents.start, handleTouchStart, passiveListener);\n                    p.wrapper.on(app.touchEvents.move, handleTouchMove);\n                    p.wrapper.on(app.touchEvents.end, handleTouchEnd, passiveListener);\n                }\n        \n                p.container[0].f7DestroyCalendarEvents = function () {\n                    p.container.find('.picker-calendar-prev-month').off('click', p.prevMonth);\n                    p.container.find('.picker-calendar-next-month').off('click', p.nextMonth);\n                    p.container.find('.picker-calendar-prev-year').off('click', p.prevYear);\n                    p.container.find('.picker-calendar-next-year').off('click', p.nextYear);\n                    p.wrapper.off('click', handleDayClick);\n                    if (p.params.touchMove) {\n                        p.wrapper.off(app.touchEvents.start, handleTouchStart, passiveListener);\n                        p.wrapper.off(app.touchEvents.move, handleTouchMove);\n                        p.wrapper.off(app.touchEvents.end, handleTouchEnd, passiveListener);\n                    }\n                };\n        \n        \n            };\n            p.destroyCalendarEvents = function (colContainer) {\n                if ('f7DestroyCalendarEvents' in p.container[0]) p.container[0].f7DestroyCalendarEvents();\n            };\n        \n            // Scan Dates Range\n            p.dateInRange = function (dayDate, range) {\n                var match = false;\n                var i;\n                if (!range) return false;\n                if ($.isArray(range)) {\n                    for (i = 0; i < range.length; i ++) {\n                        if (range[i].from || range[i].to) {\n                            if (range[i].from && range[i].to) {\n                                if ((dayDate <= new Date(range[i].to).getTime()) && (dayDate >= new Date(range[i].from).getTime())) {\n                                    match = true;\n                                }\n                            }\n                            else if (range[i].from) {\n                                if (dayDate >= new Date(range[i].from).getTime()) {\n                                    match = true;\n                                }\n                            }\n                            else if (range[i].to) {\n                                if (dayDate <= new Date(range[i].to).getTime()) {\n                                    match = true;\n                                }\n                            }\n                        } else if (dayDate === new Date(range[i]).getTime()) {\n                            match = true;\n                        }\n                    }\n                }\n                else if (range.from || range.to) {\n                    if (range.from && range.to) {\n                        if ((dayDate <= new Date(range.to).getTime()) && (dayDate >= new Date(range.from).getTime())) {\n                            match = true;\n                        }\n                    }\n                    else if (range.from) {\n                        if (dayDate >= new Date(range.from).getTime()) {\n                            match = true;\n                        }\n                    }\n                    else if (range.to) {\n                        if (dayDate <= new Date(range.to).getTime()) {\n                            match = true;\n                        }\n                    }\n                }\n                else if (typeof range === 'function') {\n                    match = range(new Date(dayDate));\n                }\n                return match;\n            };\n            // Calendar Methods\n            p.daysInMonth = function (date) {\n                var d = new Date(date);\n                return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();\n            };\n            p.monthHTML = function (date, offset) {\n                date = new Date(date);\n                var year = date.getFullYear(),\n                    month = date.getMonth(),\n                    day = date.getDate();\n                if (offset === 'next') {\n                    if (month === 11) date = new Date(year + 1, 0);\n                    else date = new Date(year, month + 1, 1);\n                }\n                if (offset === 'prev') {\n                    if (month === 0) date = new Date(year - 1, 11);\n                    else date = new Date(year, month - 1, 1);\n                }\n                if (offset === 'next' || offset === 'prev') {\n                    month = date.getMonth();\n                    year = date.getFullYear();\n                }\n                var daysInPrevMonth = p.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - 10 * 24 * 60 * 60 * 1000),\n                    daysInMonth = p.daysInMonth(date),\n                    firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay();\n                if (firstDayOfMonthIndex === 0) firstDayOfMonthIndex = 7;\n        \n                var dayDate, currentValues = [], i, j, k,\n                    rows = 6, cols = 7,\n                    monthHTML = '',\n                    dayIndex = 0 + (p.params.firstDay - 1),\n                    today = new Date().setHours(0,0,0,0),\n                    minDate = p.params.minDate ? new Date(p.params.minDate).getTime() : null,\n                    maxDate = p.params.maxDate ? new Date(p.params.maxDate).getTime() : null,\n                    disabled,\n                    hasEvent;\n        \n                if (p.value && p.value.length) {\n                    for (i = 0; i < p.value.length; i++) {\n                        currentValues.push(new Date(p.value[i]).setHours(0,0,0,0));\n                    }\n                }\n        \n                for (i = 1; i <= rows; i++) {\n                    var rowHTML = '';\n                    var row = i;\n                    for (j = 1; j <= cols; j++) {\n                        var col = j;\n                        dayIndex ++;\n                        var dayNumber = dayIndex - firstDayOfMonthIndex;\n                        var weekDayIndex = (col - 1 + p.params.firstDay > 6) ? (col - 1 - 7 + p.params.firstDay) : (col - 1 + p.params.firstDay);\n                        var addClass = '';\n                        if (dayNumber < 0) {\n                            dayNumber = daysInPrevMonth + dayNumber + 1;\n                            addClass += ' picker-calendar-day-prev';\n                            dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();\n                        }\n                        else {\n                            dayNumber = dayNumber + 1;\n                            if (dayNumber > daysInMonth) {\n                                dayNumber = dayNumber - daysInMonth;\n                                addClass += ' picker-calendar-day-next';\n                                dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();\n                            }\n                            else {\n                                dayDate = new Date(year, month, dayNumber).getTime();\n                            }\n                        }\n                        // Today\n                        if (dayDate === today) addClass += ' picker-calendar-day-today';\n                        // Selected\n                        if (p.params.rangePicker && currentValues.length === 2) {\n                            if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) addClass += ' picker-calendar-day-selected';\n                        }\n                        else {\n                            if (currentValues.indexOf(dayDate) >= 0) addClass += ' picker-calendar-day-selected';\n                        }\n                        // Weekend\n                        if (p.params.weekendDays.indexOf(weekDayIndex) >= 0) {\n                            addClass += ' picker-calendar-day-weekend';\n                        }\n                        // Has Events\n                        hasEvent = false;\n                        if (p.params.events) {\n                            if (p.dateInRange(dayDate, p.params.events)) {\n                                hasEvent = true;\n                            }\n                        }\n                        if (hasEvent) {\n                            addClass += ' picker-calendar-day-has-events';\n                        }\n                        // Custom Ranges\n                        if (p.params.rangesClasses) {\n                            for (k = 0; k < p.params.rangesClasses.length; k++) {\n                                if (p.dateInRange(dayDate, p.params.rangesClasses[k].range)) {\n                                    addClass += ' ' + p.params.rangesClasses[k].cssClass;\n                                }\n                            }\n                        }\n                        // Disabled\n                        disabled = false;\n                        if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {\n                            disabled = true;\n                        }\n                        if (p.params.disabled) {\n                            if (p.dateInRange(dayDate, p.params.disabled)) {\n                                disabled = true;\n                            }\n                        }\n                        if (disabled) {\n                            addClass += ' picker-calendar-day-disabled';\n                        }\n        \n        \n                        dayDate = new Date(dayDate);\n                        var dayYear = dayDate.getFullYear();\n                        var dayMonth = dayDate.getMonth();\n                        rowHTML += '<div data-year=\"' + dayYear + '\" data-month=\"' + dayMonth + '\" data-day=\"' + dayNumber + '\" class=\"picker-calendar-day' + (addClass) + '\" data-date=\"' + (dayYear + '-' + dayMonth + '-' + dayNumber) + '\"><span>'+dayNumber+'</span></div>';\n                    }\n                    monthHTML += '<div class=\"picker-calendar-row\">' + rowHTML + '</div>';\n                }\n                monthHTML = '<div class=\"picker-calendar-month\" data-year=\"' + year + '\" data-month=\"' + month + '\">' + monthHTML + '</div>';\n                return monthHTML;\n            };\n            p.animating = false;\n            p.updateCurrentMonthYear = function (dir) {\n                if (typeof dir === 'undefined') {\n                    p.currentMonth = parseInt(p.months.eq(1).attr('data-month'), 10);\n                    p.currentYear = parseInt(p.months.eq(1).attr('data-year'), 10);\n                }\n                else {\n                    p.currentMonth = parseInt(p.months.eq(dir === 'next' ? (p.months.length - 1) : 0).attr('data-month'), 10);\n                    p.currentYear = parseInt(p.months.eq(dir === 'next' ? (p.months.length - 1) : 0).attr('data-year'), 10);\n                }\n                p.container.find('.current-month-value').text(p.params.monthNames[p.currentMonth]);\n                p.container.find('.current-year-value').text(p.currentYear);\n        \n            };\n            p.onMonthChangeStart = function (dir) {\n                p.updateCurrentMonthYear(dir);\n                p.months.removeClass('picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next');\n                var currentIndex = dir === 'next' ? p.months.length - 1 : 0;\n        \n                p.months.eq(currentIndex).addClass('picker-calendar-month-current');\n                p.months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'picker-calendar-month-prev' : 'picker-calendar-month-next');\n        \n                if (p.params.onMonthYearChangeStart) {\n                    p.params.onMonthYearChangeStart(p, p.currentYear, p.currentMonth);\n                }\n            };\n            p.onMonthChangeEnd = function (dir, rebuildBoth) {\n                p.animating = false;\n                var nextMonthHTML, prevMonthHTML, newMonthHTML;\n                p.wrapper.find('.picker-calendar-month:not(.picker-calendar-month-prev):not(.picker-calendar-month-current):not(.picker-calendar-month-next)').remove();\n        \n                if (typeof dir === 'undefined') {\n                    dir = 'next';\n                    rebuildBoth = true;\n                }\n                if (!rebuildBoth) {\n                    newMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), dir);\n                }\n                else {\n                    p.wrapper.find('.picker-calendar-month-next, .picker-calendar-month-prev').remove();\n                    prevMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), 'prev');\n                    nextMonthHTML = p.monthHTML(new Date(p.currentYear, p.currentMonth), 'next');\n                }\n                if (dir === 'next' || rebuildBoth) {\n                    p.wrapper.append(newMonthHTML || nextMonthHTML);\n                }\n                if (dir === 'prev' || rebuildBoth) {\n                    p.wrapper.prepend(newMonthHTML || prevMonthHTML);\n                }\n                p.months = p.wrapper.find('.picker-calendar-month');\n                p.setMonthsTranslate(p.monthsTranslate);\n                if (p.params.onMonthAdd) {\n                    p.params.onMonthAdd(p, dir === 'next' ? p.months.eq(p.months.length - 1)[0] : p.months.eq(0)[0]);\n                }\n                if (p.params.onMonthYearChangeEnd) {\n                    p.params.onMonthYearChangeEnd(p, p.currentYear, p.currentMonth);\n                }\n            };\n            p.setMonthsTranslate = function (translate) {\n                translate = translate || p.monthsTranslate || 0;\n                if (typeof p.monthsTranslate === 'undefined') p.monthsTranslate = translate;\n                p.months.removeClass('picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next');\n                var prevMonthTranslate = -(translate + 1) * 100 * inverter;\n                var currentMonthTranslate = -translate * 100 * inverter;\n                var nextMonthTranslate = -(translate - 1) * 100 * inverter;\n                p.months.eq(0).transform('translate3d(' + (p.isH ? prevMonthTranslate : 0) + '%, ' + (p.isH ? 0 : prevMonthTranslate) + '%, 0)').addClass('picker-calendar-month-prev');\n                p.months.eq(1).transform('translate3d(' + (p.isH ? currentMonthTranslate : 0) + '%, ' + (p.isH ? 0 : currentMonthTranslate) + '%, 0)').addClass('picker-calendar-month-current');\n                p.months.eq(2).transform('translate3d(' + (p.isH ? nextMonthTranslate : 0) + '%, ' + (p.isH ? 0 : nextMonthTranslate) + '%, 0)').addClass('picker-calendar-month-next');\n            };\n            p.nextMonth = function (transition) {\n                if (typeof transition === 'undefined' || typeof transition === 'object') {\n                    transition = '';\n                    if (!p.params.animate) transition = 0;\n                }\n                var nextMonth = parseInt(p.months.eq(p.months.length - 1).attr('data-month'), 10);\n                var nextYear = parseInt(p.months.eq(p.months.length - 1).attr('data-year'), 10);\n                var nextDate = new Date(nextYear, nextMonth);\n                var nextDateTime = nextDate.getTime();\n                var transitionEndCallback = p.animating ? false : true;\n                if (p.params.maxDate) {\n                    if (nextDateTime > new Date(p.params.maxDate).getTime()) {\n                        return p.resetMonth();\n                    }\n                }\n                p.monthsTranslate --;\n                if (nextMonth === p.currentMonth) {\n                    var nextMonthTranslate = -(p.monthsTranslate) * 100 * inverter;\n                    var nextMonthHTML = $(p.monthHTML(nextDateTime, 'next')).transform('translate3d(' + (p.isH ? nextMonthTranslate : 0) + '%, ' + (p.isH ? 0 : nextMonthTranslate) + '%, 0)').addClass('picker-calendar-month-next');\n                    p.wrapper.append(nextMonthHTML[0]);\n                    p.months = p.wrapper.find('.picker-calendar-month');\n                    if (p.params.onMonthAdd) {\n                        p.params.onMonthAdd(p, p.months.eq(p.months.length - 1)[0]);\n                    }\n                }\n                p.animating = true;\n                p.onMonthChangeStart('next');\n                var translate = (p.monthsTranslate * 100) * inverter;\n        \n                p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)');\n                if (transitionEndCallback) {\n                    p.wrapper.transitionEnd(function () {\n                        p.onMonthChangeEnd('next');\n                    });\n                }\n                if (!p.params.animate) {\n                    p.onMonthChangeEnd('next');\n                }\n            };\n            p.prevMonth = function (transition) {\n                if (typeof transition === 'undefined' || typeof transition === 'object') {\n                    transition = '';\n                    if (!p.params.animate) transition = 0;\n                }\n                var prevMonth = parseInt(p.months.eq(0).attr('data-month'), 10);\n                var prevYear = parseInt(p.months.eq(0).attr('data-year'), 10);\n                var prevDate = new Date(prevYear, prevMonth + 1, -1);\n                var prevDateTime = prevDate.getTime();\n                var transitionEndCallback = p.animating ? false : true;\n                if (p.params.minDate) {\n                    if (prevDateTime < new Date(p.params.minDate).getTime()) {\n                        return p.resetMonth();\n                    }\n                }\n                p.monthsTranslate ++;\n                if (prevMonth === p.currentMonth) {\n                    var prevMonthTranslate = -(p.monthsTranslate) * 100 * inverter;\n                    var prevMonthHTML = $(p.monthHTML(prevDateTime, 'prev')).transform('translate3d(' + (p.isH ? prevMonthTranslate : 0) + '%, ' + (p.isH ? 0 : prevMonthTranslate) + '%, 0)').addClass('picker-calendar-month-prev');\n                    p.wrapper.prepend(prevMonthHTML[0]);\n                    p.months = p.wrapper.find('.picker-calendar-month');\n                    if (p.params.onMonthAdd) {\n                        p.params.onMonthAdd(p, p.months.eq(0)[0]);\n                    }\n                }\n                p.animating = true;\n                p.onMonthChangeStart('prev');\n                var translate = (p.monthsTranslate * 100) * inverter;\n                p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)');\n                if (transitionEndCallback) {\n                    p.wrapper.transitionEnd(function () {\n                        p.onMonthChangeEnd('prev');\n                    });\n                }\n                if (!p.params.animate) {\n                    p.onMonthChangeEnd('prev');\n                }\n            };\n            p.resetMonth = function (transition) {\n                if (typeof transition === 'undefined') transition = '';\n                var translate = (p.monthsTranslate * 100) * inverter;\n                p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? translate : 0) + '%, ' + (p.isH ? 0 : translate) + '%, 0)');\n            };\n            p.setYearMonth = function (year, month, transition) {\n                if (typeof year === 'undefined') year = p.currentYear;\n                if (typeof month === 'undefined') month = p.currentMonth;\n                if (typeof transition === 'undefined' || typeof transition === 'object') {\n                    transition = '';\n                    if (!p.params.animate) transition = 0;\n                }\n                var targetDate;\n                if (year < p.currentYear) {\n                    targetDate = new Date(year, month + 1, -1).getTime();\n                }\n                else {\n                    targetDate = new Date(year, month).getTime();\n                }\n                if (p.params.maxDate && targetDate > new Date(p.params.maxDate).getTime()) {\n                    return false;\n                }\n                if (p.params.minDate && targetDate < new Date(p.params.minDate).getTime()) {\n                    return false;\n                }\n                var currentDate = new Date(p.currentYear, p.currentMonth).getTime();\n                var dir = targetDate > currentDate ? 'next' : 'prev';\n                var newMonthHTML = p.monthHTML(new Date(year, month));\n                p.monthsTranslate = p.monthsTranslate || 0;\n                var prevTranslate = p.monthsTranslate;\n                var monthTranslate, wrapperTranslate;\n                var transitionEndCallback = p.animating ? false : true;\n                if (targetDate > currentDate) {\n                    // To next\n                    p.monthsTranslate --;\n                    if (!p.animating) p.months.eq(p.months.length - 1).remove();\n                    p.wrapper.append(newMonthHTML);\n                    p.months = p.wrapper.find('.picker-calendar-month');\n                    monthTranslate = -(prevTranslate - 1) * 100 * inverter;\n                    p.months.eq(p.months.length - 1).transform('translate3d(' + (p.isH ? monthTranslate : 0) + '%, ' + (p.isH ? 0 : monthTranslate) + '%, 0)').addClass('picker-calendar-month-next');\n                }\n                else {\n                    // To prev\n                    p.monthsTranslate ++;\n                    if (!p.animating) p.months.eq(0).remove();\n                    p.wrapper.prepend(newMonthHTML);\n                    p.months = p.wrapper.find('.picker-calendar-month');\n                    monthTranslate = -(prevTranslate + 1) * 100 * inverter;\n                    p.months.eq(0).transform('translate3d(' + (p.isH ? monthTranslate : 0) + '%, ' + (p.isH ? 0 : monthTranslate) + '%, 0)').addClass('picker-calendar-month-prev');\n                }\n                if (p.params.onMonthAdd) {\n                    p.params.onMonthAdd(p, dir === 'next' ? p.months.eq(p.months.length - 1)[0] : p.months.eq(0)[0]);\n                }\n                p.animating = true;\n                p.onMonthChangeStart(dir);\n                wrapperTranslate = (p.monthsTranslate * 100) * inverter;\n                p.wrapper.transition(transition).transform('translate3d(' + (p.isH ? wrapperTranslate : 0) + '%, ' + (p.isH ? 0 : wrapperTranslate) + '%, 0)');\n                if (transitionEndCallback) {\n                   p.wrapper.transitionEnd(function () {\n                        p.onMonthChangeEnd(dir, true);\n                    });\n                }\n                if (!p.params.animate) {\n                    p.onMonthChangeEnd(dir);\n                }\n            };\n            p.nextYear = function () {\n                p.setYearMonth(p.currentYear + 1);\n            };\n            p.prevYear = function () {\n                p.setYearMonth(p.currentYear - 1);\n            };\n        \n        \n            // HTML Layout\n            p.layout = function () {\n                var pickerHTML = '';\n                var pickerClass = '';\n                var i;\n        \n                var layoutDate = p.value && p.value.length ? p.value[0] : new Date().setHours(0,0,0,0);\n                var prevMonthHTML = p.monthHTML(layoutDate, 'prev');\n                var currentMonthHTML = p.monthHTML(layoutDate);\n                var nextMonthHTML = p.monthHTML(layoutDate, 'next');\n                var monthsHTML = '<div class=\"picker-calendar-months\"><div class=\"picker-calendar-months-wrapper\">' + (prevMonthHTML + currentMonthHTML + nextMonthHTML) + '</div></div>';\n                // Week days header\n                var weekHeaderHTML = '';\n                if (p.params.weekHeader) {\n                    for (i = 0; i < 7; i++) {\n                        var weekDayIndex = (i + p.params.firstDay > 6) ? (i - 7 + p.params.firstDay) : (i + p.params.firstDay);\n                        var dayName = p.params.dayNamesShort[weekDayIndex];\n                        weekHeaderHTML += '<div class=\"picker-calendar-week-day ' + ((p.params.weekendDays.indexOf(weekDayIndex) >= 0) ? 'picker-calendar-week-day-weekend' : '') + '\"> ' + dayName + '</div>';\n        \n                    }\n                    weekHeaderHTML = '<div class=\"picker-calendar-week-days\">' + weekHeaderHTML + '</div>';\n                }\n                pickerClass = 'picker-modal picker-calendar' +\n                            (p.params.rangePicker ? ' picker-calendar-range' : '') +\n                            (p.params.cssClass ? ' ' + p.params.cssClass : '');\n                var toolbarHTML = p.params.toolbar ? p.params.toolbarTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText) : '';\n                if (p.params.toolbar) {\n                    toolbarHTML = p.params.toolbarTemplate\n                        .replace(/{{closeText}}/g, p.params.toolbarCloseText)\n                        .replace(/{{monthPicker}}/g, (p.params.monthPicker ? p.params.monthPickerTemplate : ''))\n                        .replace(/{{yearPicker}}/g, (p.params.yearPicker ? p.params.yearPickerTemplate : ''));\n                }\n                var headerHTML = p.params.header ? p.params.headerTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText).replace(/{{placeholder}}/g, p.params.headerPlaceholder) : '';\n                var footerHTML = p.params.footer ? p.params.footerTemplate.replace(/{{closeText}}/g, p.params.toolbarCloseText) : '';\n        \n                pickerHTML =\n                    '<div class=\"' + (pickerClass) + '\">' +\n                        headerHTML +\n                        footerHTML +\n                        toolbarHTML +\n                        '<div class=\"picker-modal-inner\">' +\n                            weekHeaderHTML +\n                            monthsHTML +\n                        '</div>' +\n                    '</div>';\n        \n        \n                p.pickerHTML = pickerHTML;\n            };\n        \n            // Input Events\n            function openOnInput(e) {\n                e.preventDefault();\n                if (p.opened) return;\n                p.open();\n                if (p.params.scrollToInput && !isPopover() && !app.params.material) {\n                    var pageContent = p.input.parents('.page-content');\n                    if (pageContent.length === 0) return;\n        \n                    var paddingTop = parseInt(pageContent.css('padding-top'), 10),\n                        paddingBottom = parseInt(pageContent.css('padding-bottom'), 10),\n                        pageHeight = pageContent[0].offsetHeight - paddingTop - p.container.height(),\n                        pageScrollHeight = pageContent[0].scrollHeight - paddingTop - p.container.height(),\n                        newPaddingBottom;\n        \n                    var inputTop = p.input.offset().top - paddingTop + p.input[0].offsetHeight;\n                    if (inputTop > pageHeight) {\n                        var scrollTop = pageContent.scrollTop() + inputTop - pageHeight;\n                        if (scrollTop + pageHeight > pageScrollHeight) {\n                            newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom;\n                            if (pageHeight === pageScrollHeight) {\n                                newPaddingBottom = p.container.height();\n                            }\n                            pageContent.css({'padding-bottom': (newPaddingBottom) + 'px'});\n                        }\n                        pageContent.scrollTop(scrollTop, 300);\n                    }\n                }\n            }\n            function closeOnHTMLClick(e) {\n                if (inPopover()) return;\n                if (p.input && p.input.length > 0) {\n                    if (e.target !== p.input[0] && $(e.target).parents('.picker-modal').length === 0) p.close();\n                }\n                else {\n                    if ($(e.target).parents('.picker-modal').length === 0) p.close();\n                }\n            }\n        \n            if (p.params.input) {\n                p.input = $(p.params.input);\n                if (p.input.length > 0) {\n                    if (p.params.inputReadOnly) p.input.prop('readOnly', true);\n                    if (!p.inline) {\n                        p.input.on('click', openOnInput);\n                    }\n                    if (p.params.inputReadOnly) {\n                        p.input.on('focus mousedown', function (e) {\n                            e.preventDefault();\n                        });\n                    }\n                }\n        \n            }\n        \n            if (!p.inline && p.params.closeByOutsideClick) $('html').on('click', closeOnHTMLClick);\n        \n            // Open\n            function onPickerClose() {\n                p.opened = false;\n                if (p.input && p.input.length > 0) {\n                    p.input.parents('.page-content').css({'padding-bottom': ''});\n                    if (app.params.material) p.input.trigger('blur');\n                }\n                if (p.params.onClose) p.params.onClose(p);\n        \n                // Destroy events\n                p.destroyCalendarEvents();\n            }\n        \n            p.opened = false;\n            p.open = function () {\n                var toPopover = isPopover();\n                var updateValue = false;\n                if (!p.opened) {\n                    // Set date value\n                    if (!p.value) {\n                        if (p.params.value) {\n                            p.value = p.params.value;\n                            updateValue = true;\n                        }\n                    }\n        \n                    // Layout\n                    p.layout();\n        \n                    // Append\n                    if (toPopover) {\n                        p.pickerHTML = '<div class=\"popover popover-picker-calendar\"><div class=\"popover-inner\">' + p.pickerHTML + '</div></div>';\n                        p.popover = app.popover(p.pickerHTML, p.params.input, true);\n                        p.container = $(p.popover).find('.picker-modal');\n                        $(p.popover).on('close', function () {\n                            onPickerClose();\n                        });\n                    }\n                    else if (p.inline) {\n                        p.container = $(p.pickerHTML);\n                        p.container.addClass('picker-modal-inline');\n                        $(p.params.container).append(p.container);\n                    }\n                    else {\n                        p.container = $(app.pickerModal(p.pickerHTML));\n                        $(p.container)\n                        .on('close', function () {\n                            onPickerClose();\n                        });\n                    }\n        \n                    // Store calendar instance\n                    p.container[0].f7Calendar = p;\n                    p.wrapper = p.container.find('.picker-calendar-months-wrapper');\n        \n                    // Months\n                    p.months = p.wrapper.find('.picker-calendar-month');\n        \n                    // Update current month and year\n                    p.updateCurrentMonthYear();\n        \n                    // Set initial translate\n                    p.monthsTranslate = 0;\n                    p.setMonthsTranslate();\n        \n                    // Init events\n                    p.initCalendarEvents();\n        \n                    // Update input value\n                    if (updateValue) p.updateValue();\n                    else if (app.params.material && p.value) p.updateValue(true);\n        \n                    // Material Focus\n                    if (p.input && p.input.length > 0 && app.params.material) {\n                        p.input.trigger('focus');\n                    }\n        \n                }\n        \n                // Set flag\n                p.opened = true;\n                p.initialized = true;\n                if (p.params.onMonthAdd) {\n                    p.months.each(function () {\n                        p.params.onMonthAdd(p, this);\n                    });\n                }\n                if (p.params.onOpen) p.params.onOpen(p);\n            };\n        \n            // Close\n            p.close = function () {\n                if (!p.opened || p.inline) return;\n                if (inPopover()) {\n                    app.closeModal(p.popover);\n                    return;\n                }\n                else {\n                    app.closeModal(p.container);\n                    return;\n                }\n            };\n        \n            // Destroy\n            p.destroy = function () {\n                p.close();\n                if (p.params.input && p.input.length > 0) {\n                    p.input.off('click focus', openOnInput);\n                }\n                $('html').off('click', closeOnHTMLClick);\n            };\n        \n            if (p.inline) {\n                p.open();\n            }\n            else {\n                if (!p.initialized && p.params.value) p.setValue(p.params.value);\n            }\n        \n            return p;\n        };\n        app.calendar = function (params) {\n            return new Calendar(params);\n        };\n        \n\n        /*======================================================\n        ************   Notifications   ************\n        ======================================================*/\n        var _tempNotificationElement;\n        app.addNotification = function (params) {\n            if (!params) return;\n            \n            if (typeof params.media === 'undefined') params.media = app.params.notificationMedia;\n            if (typeof params.title === 'undefined') params.title = app.params.notificationTitle;\n            if (typeof params.subtitle === 'undefined') params.subtitle = app.params.notificationSubtitle;\n            if (typeof params.closeIcon === 'undefined') params.closeIcon = app.params.notificationCloseIcon;\n            if (typeof params.hold === 'undefined') params.hold = app.params.notificationHold;\n            if (typeof params.closeOnClick === 'undefined') params.closeOnClick = app.params.notificationCloseOnClick;\n            if (typeof params.button === 'undefined') params.button = app.params.notificationCloseButtonText && {\n                text: app.params.notificationCloseButtonText,\n                close: true\n            };\n        \n            if (!_tempNotificationElement) _tempNotificationElement = document.createElement('div');\n        \n            params.material = app.params.material;\n        \n            var container = $('.notifications');\n            if (container.length === 0) {\n                app.root.append('<div class=\"notifications list-block' + (params.material ? '' : ' media-list') + '\"><ul></ul></div>');\n                container = $('.notifications');\n            }\n            var list = container.children('ul');\n            \n            var notificationTemplate = app.params.notificationTemplate || \n                '{{#if custom}}' +\n                '<li>{{custom}}</li>' +\n                '{{else}}' +\n                '<li class=\"notification-item notification-hidden\">' +\n                    '<div class=\"item-content\">' +\n                        '{{#if material}}' +\n                            '<div class=\"item-inner\">' +\n                                '<div class=\"item-title\">{{js \"this.message || this.title || this.subtitle\"}}</div>' +\n                                '{{#if ../button}}{{#button}}' +\n                                '<div class=\"item-after\">' +\n                                    '<a href=\"#\" class=\"button {{#if color}}color-{{color}}{{/if}} {{#js_compare \"this.close !== false\"}}close-notification{{/js_compare}}\">{{text}}</a>' +\n                                '</div>' +\n                                '{{/button}}{{/if}}' +\n                            '</div>' +\n                        '{{else}}' +\n                            '{{#if media}}' +\n                            '<div class=\"item-media\">{{media}}</div>' +\n                            '{{/if}}' +\n                            '<div class=\"item-inner\">' +\n                                '<div class=\"item-title-row\">' +\n                                    '{{#if title}}' +\n                                    '<div class=\"item-title\">{{title}}</div>' +\n                                    '{{/if}}' +\n                                    '{{#if closeIcon}}' +\n                                    '<div class=\"item-after\"><a href=\"#\" class=\"close-notification\"><span></span></a></div>' +\n                                    '{{/if}}' +\n                                '</div>' +\n                                '{{#if subtitle}}' +\n                                '<div class=\"item-subtitle\">{{subtitle}}</div>' +\n                                '{{/if}}' +\n                                '{{#if message}}' +\n                                '<div class=\"item-text\">{{message}}</div>' +\n                                '</div>' +\n                            '{{/if}}' +\n                        '{{/if}}' +\n                    '</div>' +\n                '</li>' +\n                '{{/if}}';\n            if (!app._compiledTemplates.notification) {\n                app._compiledTemplates.notification = t7.compile(notificationTemplate);\n            }\n            _tempNotificationElement.innerHTML = app._compiledTemplates.notification(params);\n        \n            var item = $(_tempNotificationElement).children();\n        \n            item.on('click', function (e) {\n                var close = false;\n                var target = $(e.target);\n                if (params.material && target.hasClass('button')) {\n                    if (params.button && params.button.onClick) params.button.onClick.call(target[0], e, item[0]);\n                }\n                if (target.is('.close-notification') || $(e.target).parents('.close-notification').length > 0) {\n                    close = true;\n                }\n                else {\n                    if (params.onClick) params.onClick(e, item[0]);\n                    if (params.closeOnClick) close = true;\n                }\n                if (close) app.closeNotification(item[0]);\n            });\n            if (params.onClose) {\n                item.data('f7NotificationOnClose', function () {\n                    params.onClose(item[0]);\n                });\n            }\n            if (params.additionalClass) {\n                item.addClass(params.additionalClass);\n            }\n            if (params.hold) {\n                setTimeout(function () {\n                    if (item.length > 0) app.closeNotification(item[0]);\n                }, params.hold);\n            }\n        \n            if (!app.params.material) {\n                app.closeNotification(list.children('li.notification-item:last-child'));\n            }\n            list.append(item[0]);\n            container.show();\n        \n            var itemHeight = item.outerHeight(), clientLeft;\n            if (params.material) {\n                container.transform('translate3d(0, '+itemHeight+'px, 0)');\n                container.transition(0);\n        \n                clientLeft = item[0].clientLeft;\n        \n                container.transform('translate3d(0, 0, 0)');\n                container.transition('');\n            }\n            else {\n                item.transform('translate3d(0,' + (-itemHeight) + 'px,0)');\n                item.transition(0);\n        \n                clientLeft = item[0].clientLeft;\n        \n                item.transition('');\n                item.transform('translate3d(0,0px,0)');\n            }\n        \n            container.transform('translate3d(0, 0,0)');\n            item.removeClass('notification-hidden');\n        \n            return item[0];\n        };\n        app.closeNotification = function (item) {\n            item = $(item);\n            if (item.length === 0) return;\n            if (item.hasClass('notification-item-removing')) return;\n            var container = $('.notifications');\n        \n            var itemHeight = item.outerHeight();\n            item.css('height', itemHeight + 'px').transition(0).addClass('notification-item-removing');\n            var clientLeft = item[0].clientLeft;\n        \n            item.css({\n                height: '0px',\n                marginBottom: '0px'\n            }).transition('');\n        \n            if (item.data('f7NotificationOnClose')) item.data('f7NotificationOnClose')();\n        \n            if (container.find('.notification-item:not(.notification-item-removing)').length === 0) {\n                container.transform('');\n            }\n        \n            item.addClass('notification-hidden').transitionEnd(function () {\n                item.remove();\n                if (container.find('.notification-item').length === 0) {\n                    container.hide();\n                }\n            });\n        };\n\n        /*===========================\n        Compile Template7 Templates On App Init\n        ===========================*/\n        app.initTemplate7Templates = function () {\n            if (!window.Template7) return;\n            Template7.templates = Template7.templates || app.params.templates || {};\n            Template7.data = Template7.data || app.params.template7Data || {};\n            Template7.cache = Template7.cache || {};\n        \n            app.templates = Template7.templates;\n            app.template7Data = Template7.data;\n            app.template7Cache = Template7.cache;\n        \n            // Precompile templates on app init\n            if (!app.params.precompileTemplates) return;\n            $('script[type=\"text/template7\"]').each(function () {\n                var id = $(this).attr('id');\n                if (!id) return;\n                Template7.templates[id] = Template7.compile($(this).html());\n            });\n        };\n        \n\n        /*=======================================\n        ************   Plugins API   ************\n        =======================================*/\n        var _plugins = [];\n        app.initPlugins = function () {\n            // Initialize plugins\n            for (var plugin in app.plugins) {\n                var p = app.plugins[plugin](app, app.params[plugin]);\n                if (p) _plugins.push(p);\n            }\n        };\n        // Plugin Hooks\n        app.pluginHook = function (hook) {\n            for (var i = 0; i < _plugins.length; i++) {\n                if (_plugins[i].hooks && hook in _plugins[i].hooks) {\n                    _plugins[i].hooks[hook](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);\n                }\n            }\n        };\n        // Prevented by plugin\n        app.pluginPrevent = function (action) {\n            var prevent = false;\n            for (var i = 0; i < _plugins.length; i++) {\n                if (_plugins[i].prevents && action in _plugins[i].prevents) {\n                    if (_plugins[i].prevents[action](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5])) prevent = true;\n                }\n            }\n            return prevent;\n        };\n        // Preprocess content by plugin\n        app.pluginProcess = function (process, data) {\n            var processed = data;\n            for (var i = 0; i < _plugins.length; i++) {\n                if (_plugins[i].preprocess && process in _plugins[i].preprocess) {\n                    processed = _plugins[i].preprocess[process](data, arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);\n                }\n            }\n            return processed;\n        };\n        \n        \n\n        /*======================================================\n        ************   App Init   ************\n        ======================================================*/\n        app.init = function () {\n            // Compile Template7 templates on app load\n            if (app.initTemplate7Templates) app.initTemplate7Templates();\n            \n            // Init Plugins\n            if (app.initPlugins) app.initPlugins();\n            \n            // Init Device\n            if (app.getDeviceInfo) app.getDeviceInfo();\n            \n            // Init Click events\n            if (app.initFastClicks && app.params.fastClicks) app.initFastClicks();\n            if (app.initClickEvents) app.initClickEvents();\n        \n            // Init each page callbacks\n            $('.page:not(.cached)').each(function () {\n                app.initPageWithCallback(this);\n            });\n        \n            // Init each navbar callbacks\n            $('.navbar:not(.cached)').each(function () {\n                app.initNavbarWithCallback(this); \n            });\n            \n            // Init resize events\n            if (app.initResize) app.initResize();\n        \n            // Init push state\n            if (app.initPushState && app.params.pushState) app.initPushState();\n        \n            // Init Live Swipeouts events\n            if (app.initSwipeout && app.params.swipeout) app.initSwipeout();\n        \n            // Init Live Sortable events\n            if (app.initSortable && app.params.sortable) app.initSortable();\n        \n            // Init Live Swipe Panels\n            if (app.initSwipePanels && (app.params.swipePanel || app.params.swipePanelOnlyClose)) app.initSwipePanels();\n            \n            // Init Material Inputs\n            if (app.params.material && app.initMaterialWatchInputs) app.initMaterialWatchInputs();\n            \n            // App Init callback\n            if (app.params.onAppInit) app.params.onAppInit();\n        \n            // Plugin app init hook\n            app.pluginHook('appInit');\n        };\n        if (app.params.init) app.init();\n        \n\n        //Return instance        \n        return app;\n    };\n    \n\n    /*===========================\n    Dom7 Library\n    ===========================*/\n    var Dom7 = (function () {\n        var Dom7 = function (arr) {\n            var _this = this, i = 0;\n            // Create array-like object\n            for (i = 0; i < arr.length; i++) {\n                _this[i] = arr[i];\n            }\n            _this.length = arr.length;\n            // Return collection with methods\n            return this;\n        };\n        var $ = function (selector, context) {\n            var arr = [], i = 0;\n            if (selector && !context) {\n                if (selector instanceof Dom7) {\n                    return selector;\n                }\n            }\n            if (selector) {\n                // String\n                if (typeof selector === 'string') {\n                    var els, tempParent, html;\n                    selector = html = selector.trim();\n                    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n                        var toCreate = 'div';\n                        if (html.indexOf('<li') === 0) toCreate = 'ul';\n                        if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n                        if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n                        if (html.indexOf('<tbody') === 0) toCreate = 'table';\n                        if (html.indexOf('<option') === 0) toCreate = 'select';\n                        tempParent = document.createElement(toCreate);\n                        tempParent.innerHTML = html;\n                        for (i = 0; i < tempParent.childNodes.length; i++) {\n                            arr.push(tempParent.childNodes[i]);\n                        }\n                    }\n                    else {\n                        if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {\n                            // Pure ID selector\n                            els = [document.getElementById(selector.split('#')[1])];\n                        }\n                        else {\n                            // Other selectors\n                            els = (context || document).querySelectorAll(selector);\n                        }\n                        for (i = 0; i < els.length; i++) {\n                            if (els[i]) arr.push(els[i]);\n                        }\n                    }\n                }\n                // Node/element\n                else if (selector.nodeType || selector === window || selector === document) {\n                    arr.push(selector);\n                }\n                //Array of elements or instance of Dom\n                else if (selector.length > 0 && selector[0].nodeType) {\n                    for (i = 0; i < selector.length; i++) {\n                        arr.push(selector[i]);\n                    }\n                }\n            }\n            return new Dom7(arr);\n        };\n\n        Dom7.prototype = {\n            // Classes and attriutes\n            addClass: function (className) {\n                if (typeof className === 'undefined') {\n                    return this;\n                }\n                var classes = className.split(' ');\n                for (var i = 0; i < classes.length; i++) {\n                    for (var j = 0; j < this.length; j++) {\n                        if (typeof this[j].classList !== 'undefined') this[j].classList.add(classes[i]);\n                    }\n                }\n                return this;\n            },\n            removeClass: function (className) {\n                var classes = className.split(' ');\n                for (var i = 0; i < classes.length; i++) {\n                    for (var j = 0; j < this.length; j++) {\n                        if (typeof this[j].classList !== 'undefined') this[j].classList.remove(classes[i]);\n                    }\n                }\n                return this;\n            },\n            hasClass: function (className) {\n                if (!this[0]) return false;\n                else return this[0].classList.contains(className);\n            },\n            toggleClass: function (className) {\n                var classes = className.split(' ');\n                for (var i = 0; i < classes.length; i++) {\n                    for (var j = 0; j < this.length; j++) {\n                        if (typeof this[j].classList !== 'undefined') this[j].classList.toggle(classes[i]);\n                    }\n                }\n                return this;\n            },\n            attr: function (attrs, value) {\n                if (arguments.length === 1 && typeof attrs === 'string') {\n                    // Get attr\n                    if (this[0]) return this[0].getAttribute(attrs);\n                    else return undefined;\n                }\n                else {\n                    // Set attrs\n                    for (var i = 0; i < this.length; i++) {\n                        if (arguments.length === 2) {\n                            // String\n                            this[i].setAttribute(attrs, value);\n                        }\n                        else {\n                            // Object\n                            for (var attrName in attrs) {\n                                this[i][attrName] = attrs[attrName];\n                                this[i].setAttribute(attrName, attrs[attrName]);\n                            }\n                        }\n                    }\n                    return this;\n                }\n            },\n            removeAttr: function (attr) {\n                for (var i = 0; i < this.length; i++) {\n                    this[i].removeAttribute(attr);\n                }\n                return this;\n            },\n            prop: function (props, value) {\n                if (arguments.length === 1 && typeof props === 'string') {\n                    // Get prop\n                    if (this[0]) return this[0][props];\n                    else return undefined;\n                }\n                else {\n                    // Set props\n                    for (var i = 0; i < this.length; i++) {\n                        if (arguments.length === 2) {\n                            // String\n                            this[i][props] = value;\n                        }\n                        else {\n                            // Object\n                            for (var propName in props) {\n                                this[i][propName] = props[propName];\n                            }\n                        }\n                    }\n                    return this;\n                }\n            },\n            data: function (key, value) {\n                if (typeof value === 'undefined') {\n                    // Get value\n                    if (this[0]) {\n                        if (this[0].dom7ElementDataStorage && (key in this[0].dom7ElementDataStorage)) {\n                            return this[0].dom7ElementDataStorage[key];\n                        }\n                        else {\n                            var dataKey = this[0].getAttribute('data-' + key);    \n                            if (dataKey) {\n                                return dataKey;\n                            }\n                            else return undefined;\n                        }\n                    }\n                    else return undefined;\n                }\n                else {\n                    // Set value\n                    for (var i = 0; i < this.length; i++) {\n                        var el = this[i];\n                        if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n                        el.dom7ElementDataStorage[key] = value;\n                    }\n                    return this;\n                }\n            },\n            removeData: function(key) {\n                for (var i = 0; i < this.length; i++) {\n                    var el = this[i];\n                    if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n                        el.dom7ElementDataStorage[key] = null;\n                        delete el.dom7ElementDataStorage[key];\n                    }\n                }\n            },\n            dataset: function () {\n                var el = this[0];\n                if (el) {\n                    var dataset = {};\n                    if (el.dataset) {\n                        for (var dataKey in el.dataset) {\n                            dataset[dataKey] = el.dataset[dataKey];\n                        }\n                    }\n                    else {\n                        for (var i = 0; i < el.attributes.length; i++) {\n                            var attr = el.attributes[i];\n                            if (attr.name.indexOf('data-') >= 0) {\n                                dataset[$.toCamelCase(attr.name.split('data-')[1])] = attr.value;\n                            }\n                        }\n                    }\n                    for (var key in dataset) {\n                        if (dataset[key] === 'false') dataset[key] = false;\n                        else if (dataset[key] === 'true') dataset[key] = true;\n                        else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] = dataset[key] * 1;\n                    }\n                    return dataset;\n                }\n                else return undefined;\n            },\n            val: function (value) {\n                if (typeof value === 'undefined') {\n                    if (this[0]) return this[0].value;\n                    else return undefined;\n                }\n                else {\n                    for (var i = 0; i < this.length; i++) {\n                        this[i].value = value;\n                    }\n                    return this;\n                }\n            },\n            // Transforms\n            transform : function (transform) {\n                for (var i = 0; i < this.length; i++) {\n                    var elStyle = this[i].style;\n                    elStyle.webkitTransform = elStyle.MsTransform = elStyle.msTransform = elStyle.MozTransform = elStyle.OTransform = elStyle.transform = transform;\n                }\n                return this;\n            },\n            transition: function (duration) {\n                if (typeof duration !== 'string') {\n                    duration = duration + 'ms';\n                }\n                for (var i = 0; i < this.length; i++) {\n                    var elStyle = this[i].style;\n                    elStyle.webkitTransitionDuration = elStyle.MsTransitionDuration = elStyle.msTransitionDuration = elStyle.MozTransitionDuration = elStyle.OTransitionDuration = elStyle.transitionDuration = duration;\n                }\n                return this;\n            },\n            //Events\n            on: function (eventName, targetSelector, listener, capture) {\n                function handleLiveEvent(e) {\n                    var target = e.target;\n                    if ($(target).is(targetSelector)) listener.call(target, e);\n                    else {\n                        var parents = $(target).parents();\n                        for (var k = 0; k < parents.length; k++) {\n                            if ($(parents[k]).is(targetSelector)) listener.call(parents[k], e);\n                        }\n                    }\n                }\n                var events = eventName.split(' ');\n                var i, j;\n                for (i = 0; i < this.length; i++) {\n                    if (typeof targetSelector === 'function' || targetSelector === false) {\n                        // Usual events\n                        if (typeof targetSelector === 'function') {\n                            listener = arguments[1];\n                            capture = arguments[2] || false;\n                        }\n                        for (j = 0; j < events.length; j++) {\n                            this[i].addEventListener(events[j], listener, capture);\n                        }\n                    }\n                    else {\n                        //Live events\n                        for (j = 0; j < events.length; j++) {\n                            if (!this[i].dom7LiveListeners) this[i].dom7LiveListeners = [];\n                            this[i].dom7LiveListeners.push({listener: listener, liveListener: handleLiveEvent});\n                            this[i].addEventListener(events[j], handleLiveEvent, capture);\n                        }\n                    }\n                }\n        \n                return this;\n            },\n            off: function (eventName, targetSelector, listener, capture) {\n                var events = eventName.split(' ');\n                for (var i = 0; i < events.length; i++) {\n                    for (var j = 0; j < this.length; j++) {\n                        if (typeof targetSelector === 'function' || targetSelector === false) {\n                            // Usual events\n                            if (typeof targetSelector === 'function') {\n                                listener = arguments[1];\n                                capture = arguments[2] || false;\n                            }\n                            this[j].removeEventListener(events[i], listener, capture);\n                        }\n                        else {\n                            // Live event\n                            if (this[j].dom7LiveListeners) {\n                                for (var k = 0; k < this[j].dom7LiveListeners.length; k++) {\n                                    if (this[j].dom7LiveListeners[k].listener === listener) {\n                                        this[j].removeEventListener(events[i], this[j].dom7LiveListeners[k].liveListener, capture);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n                return this;\n            },\n            once: function (eventName, targetSelector, listener, capture) {\n                var dom = this;\n                if (typeof targetSelector === 'function') {\n                    listener = arguments[1];\n                    capture = arguments[2];\n                    targetSelector = false;\n                }\n                function proxy(e) {\n                    listener.call(e.target, e);\n                    dom.off(eventName, targetSelector, proxy, capture);\n                }\n                return dom.on(eventName, targetSelector, proxy, capture);\n            },\n            trigger: function (eventName, eventData) {\n                var events = eventName.split(' ');\n                for (var i = 0; i < events.length; i++) {\n                    for (var j = 0; j < this.length; j++) {\n                        var evt;\n                        try {\n                            evt = new CustomEvent(events[i], {detail: eventData, bubbles: true, cancelable: true});\n                        }\n                        catch (e) {\n                            evt = document.createEvent('Event');\n                            evt.initEvent(events[i], true, true);\n                            evt.detail = eventData;\n                        }\n                        this[j].dispatchEvent(evt);\n                    }\n                }\n                return this;\n            },\n            transitionEnd: function (callback) {\n                var events = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'],\n                    i, j, dom = this;\n                function fireCallBack(e) {\n                    /*jshint validthis:true */\n                    if (e.target !== this) return;\n                    callback.call(this, e);\n                    for (i = 0; i < events.length; i++) {\n                        dom.off(events[i], fireCallBack);\n                    }\n                }\n                if (callback) {\n                    for (i = 0; i < events.length; i++) {\n                        dom.on(events[i], fireCallBack);\n                    }\n                }\n                return this;\n            },\n            animationEnd: function (callback) {\n                var events = ['webkitAnimationEnd', 'OAnimationEnd', 'MSAnimationEnd', 'animationend'],\n                    i, j, dom = this;\n                function fireCallBack(e) {\n                    callback(e);\n                    for (i = 0; i < events.length; i++) {\n                        dom.off(events[i], fireCallBack);\n                    }\n                }\n                if (callback) {\n                    for (i = 0; i < events.length; i++) {\n                        dom.on(events[i], fireCallBack);\n                    }\n                }\n                return this;\n            },\n            // Sizing/Styles\n            width: function () {\n                if (this[0] === window) {\n                    return window.innerWidth;\n                }\n                else {\n                    if (this.length > 0) {\n                        return parseFloat(this.css('width'));\n                    }\n                    else {\n                        return null;\n                    }\n                }\n            },\n            outerWidth: function (includeMargins) {\n                if (this.length > 0) {\n                    if (includeMargins) {\n                        var styles = this.styles();\n                        return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));    \n                    }\n                    else\n                        return this[0].offsetWidth;\n                }\n                else return null;\n            },\n            height: function () {\n                if (this[0] === window) {\n                    return window.innerHeight;\n                }\n                else {\n                    if (this.length > 0) {\n                        return parseFloat(this.css('height'));\n                    }\n                    else {\n                        return null;\n                    }\n                }\n            },\n            outerHeight: function (includeMargins) {\n                if (this.length > 0) {\n                    if (includeMargins) {\n                        var styles = this.styles();\n                        return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));    \n                    }\n                    else\n                        return this[0].offsetHeight;\n                }\n                else return null;\n            },\n            offset: function () {\n                if (this.length > 0) {\n                    var el = this[0];\n                    var box = el.getBoundingClientRect();\n                    var body = document.body;\n                    var clientTop  = el.clientTop  || body.clientTop  || 0;\n                    var clientLeft = el.clientLeft || body.clientLeft || 0;\n                    var scrollTop  = window.pageYOffset || el.scrollTop;\n                    var scrollLeft = window.pageXOffset || el.scrollLeft;\n                    return {\n                        top: box.top  + scrollTop  - clientTop,\n                        left: box.left + scrollLeft - clientLeft\n                    };\n                }\n                else {\n                    return null;\n                }\n            },\n            hide: function () {\n                for (var i = 0; i < this.length; i++) {\n                    this[i].style.display = 'none';\n                }\n                return this;\n            },\n            show: function () {\n                for (var i = 0; i < this.length; i++) {\n                    this[i].style.display = 'block';\n                }\n                return this;\n            },\n            styles: function () {\n                var i, styles;\n                if (this[0]) return window.getComputedStyle(this[0], null);\n                else return undefined;\n            },\n            css: function (props, value) {\n                var i;\n                if (arguments.length === 1) {\n                    if (typeof props === 'string') {\n                        if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n                    }\n                    else {\n                        for (i = 0; i < this.length; i++) {\n                            for (var prop in props) {\n                                this[i].style[prop] = props[prop];\n                            }\n                        }\n                        return this;\n                    }\n                }\n                if (arguments.length === 2 && typeof props === 'string') {\n                    for (i = 0; i < this.length; i++) {\n                        this[i].style[props] = value;\n                    }\n                    return this;\n                }\n                return this;\n            },\n        \n            //Dom manipulation\n            each: function (callback) {\n                for (var i = 0; i < this.length; i++) {\n                    callback.call(this[i], i, this[i]);\n                }\n                return this;\n            },\n            filter: function (callback) {\n                var matchedItems = [];\n                var dom = this;\n                for (var i = 0; i < dom.length; i++) {\n                    if (callback.call(dom[i], i, dom[i])) matchedItems.push(dom[i]);\n                }\n                return new Dom7(matchedItems);\n            },\n            html: function (html) {\n                if (typeof html === 'undefined') {\n                    return this[0] ? this[0].innerHTML : undefined;\n                }\n                else {\n                    for (var i = 0; i < this.length; i++) {\n                        this[i].innerHTML = html;\n                    }\n                    return this;\n                }\n            },\n            text: function (text) {\n                if (typeof text === 'undefined') {\n                    if (this[0]) {\n                        return this[0].textContent.trim();\n                    }\n                    else return null;\n                }\n                else {\n                    for (var i = 0; i < this.length; i++) {\n                        this[i].textContent = text;\n                    }\n                    return this;\n                }\n            },\n            is: function (selector) {\n                if (!this[0] || typeof selector === 'undefined') return false;\n                var compareWith, i;\n                if (typeof selector === 'string') {\n                    var el = this[0];\n                    if (el === document) return selector === document;\n                    if (el === window) return selector === window;\n        \n                    if (el.matches) return el.matches(selector);\n                    else if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n                    else if (el.mozMatchesSelector) return el.mozMatchesSelector(selector);\n                    else if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n                    else {\n                        compareWith = $(selector);\n                        for (i = 0; i < compareWith.length; i++) {\n                            if (compareWith[i] === this[0]) return true;\n                        }\n                        return false;\n                    }\n                }\n                else if (selector === document) return this[0] === document;\n                else if (selector === window) return this[0] === window;\n                else {\n                    if (selector.nodeType || selector instanceof Dom7) {\n                        compareWith = selector.nodeType ? [selector] : selector;\n                        for (i = 0; i < compareWith.length; i++) {\n                            if (compareWith[i] === this[0]) return true;\n                        }\n                        return false;\n                    }\n                    return false;\n                }\n        \n            },\n            indexOf: function (el) {\n                for (var i = 0; i < this.length; i++) {\n                    if (this[i] === el) return i;\n                }\n            },\n            index: function () {\n                if (this[0]) {\n                    var child = this[0];\n                    var i = 0;\n                    while ((child = child.previousSibling) !== null) {\n                        if (child.nodeType === 1) i++;\n                    }\n                    return i;\n                }\n                else return undefined;\n            },\n            eq: function (index) {\n                if (typeof index === 'undefined') return this;\n                var length = this.length;\n                var returnIndex;\n                if (index > length - 1) {\n                    return new Dom7([]);\n                }\n                if (index < 0) {\n                    returnIndex = length + index;\n                    if (returnIndex < 0) return new Dom7([]);\n                    else return new Dom7([this[returnIndex]]);\n                }\n                return new Dom7([this[index]]);\n            },\n            append: function (newChild) {\n                var i, j;\n                for (i = 0; i < this.length; i++) {\n                    if (typeof newChild === 'string') {\n                        var tempDiv = document.createElement('div');\n                        tempDiv.innerHTML = newChild;\n                        while (tempDiv.firstChild) {\n                            this[i].appendChild(tempDiv.firstChild);\n                        }\n                    }\n                    else if (newChild instanceof Dom7) {\n                        for (j = 0; j < newChild.length; j++) {\n                            this[i].appendChild(newChild[j]);\n                        }\n                    }\n                    else {\n                        this[i].appendChild(newChild);\n                    }\n                }\n                return this;\n            },\n            appendTo: function (parent) {\n                $(parent).append(this);\n                return this;\n            },\n            prepend: function (newChild) {\n                var i, j;\n                for (i = 0; i < this.length; i++) {\n                    if (typeof newChild === 'string') {\n                        var tempDiv = document.createElement('div');\n                        tempDiv.innerHTML = newChild;\n                        for (j = tempDiv.childNodes.length - 1; j >= 0; j--) {\n                            this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n                        }\n                        // this[i].insertAdjacentHTML('afterbegin', newChild);\n                    }\n                    else if (newChild instanceof Dom7) {\n                        for (j = 0; j < newChild.length; j++) {\n                            this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n                        }\n                    }\n                    else {\n                        this[i].insertBefore(newChild, this[i].childNodes[0]);\n                    }\n                }\n                return this;\n            },\n            prependTo: function (parent) {\n                $(parent).prepend(this);\n                return this;\n            },\n            insertBefore: function (selector) {\n                var before = $(selector);\n                for (var i = 0; i < this.length; i++) {\n                    if (before.length === 1) {\n                        before[0].parentNode.insertBefore(this[i], before[0]);\n                    }\n                    else if (before.length > 1) {\n                        for (var j = 0; j < before.length; j++) {\n                            before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n                        }\n                    }\n                }\n            },\n            insertAfter: function (selector) {\n                var after = $(selector);\n                for (var i = 0; i < this.length; i++) {\n                    if (after.length === 1) {\n                        after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n                    }\n                    else if (after.length > 1) {\n                        for (var j = 0; j < after.length; j++) {\n                            after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n                        }\n                    }\n                }\n            },\n            next: function (selector) {\n                if (this.length > 0) {\n                    if (selector) {\n                        if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) return new Dom7([this[0].nextElementSibling]);\n                        else return new Dom7([]);\n                    }\n                    else {\n                        if (this[0].nextElementSibling) return new Dom7([this[0].nextElementSibling]);\n                        else return new Dom7([]);\n                    }\n                }\n                else return new Dom7([]);\n            },\n            nextAll: function (selector) {\n                var nextEls = [];\n                var el = this[0];\n                if (!el) return new Dom7([]);\n                while (el.nextElementSibling) {\n                    var next = el.nextElementSibling;\n                    if (selector) {\n                        if($(next).is(selector)) nextEls.push(next);\n                    }\n                    else nextEls.push(next);\n                    el = next;\n                }\n                return new Dom7(nextEls);\n            },\n            prev: function (selector) {\n                if (this.length > 0) {\n                    if (selector) {\n                        if (this[0].previousElementSibling && $(this[0].previousElementSibling).is(selector)) return new Dom7([this[0].previousElementSibling]);\n                        else return new Dom7([]);\n                    }\n                    else {\n                        if (this[0].previousElementSibling) return new Dom7([this[0].previousElementSibling]);\n                        else return new Dom7([]);\n                    }\n                }\n                else return new Dom7([]);\n            },\n            prevAll: function (selector) {\n                var prevEls = [];\n                var el = this[0];\n                if (!el) return new Dom7([]);\n                while (el.previousElementSibling) {\n                    var prev = el.previousElementSibling;\n                    if (selector) {\n                        if($(prev).is(selector)) prevEls.push(prev);\n                    }\n                    else prevEls.push(prev);\n                    el = prev;\n                }\n                return new Dom7(prevEls);\n            },\n            siblings: function (selector) {\n                return this.nextAll(selector).add(this.prevAll(selector));\n            },\n            parent: function (selector) {\n                var parents = [];\n                for (var i = 0; i < this.length; i++) {\n                    if (this[i].parentNode !== null) {\n                        if (selector) {\n                            if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n                        }\n                        else {\n                           parents.push(this[i].parentNode);\n                        }\n                    }\n                }\n                return $($.unique(parents));\n            },\n            parents: function (selector) {\n                var parents = [];\n                for (var i = 0; i < this.length; i++) {\n                    var parent = this[i].parentNode;\n                    while (parent) {\n                        if (selector) {\n                            if ($(parent).is(selector)) parents.push(parent);\n                        }\n                        else {\n                            parents.push(parent);\n                        }\n                        parent = parent.parentNode;\n                    }\n                }\n                return $($.unique(parents));\n            },\n            closest: function (selector) {\n                var closest = this;\n                if (typeof selector === 'undefined') {\n                    return new Dom7([]);\n                }\n                if (!closest.is(selector)) {\n                    closest = closest.parents(selector).eq(0);\n                }\n                return closest;\n            },\n            find : function (selector) {\n                var foundElements = [];\n                for (var i = 0; i < this.length; i++) {\n                    var found = this[i].querySelectorAll(selector);\n                    for (var j = 0; j < found.length; j++) {\n                        foundElements.push(found[j]);\n                    }\n                }\n                return new Dom7(foundElements);\n            },\n            children: function (selector) {\n                var children = [];\n                for (var i = 0; i < this.length; i++) {\n                    var childNodes = this[i].childNodes;\n        \n                    for (var j = 0; j < childNodes.length; j++) {\n                        if (!selector) {\n                            if (childNodes[j].nodeType === 1) children.push(childNodes[j]);\n                        }\n                        else {\n                            if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) children.push(childNodes[j]);\n                        }\n                    }\n                }\n                return new Dom7($.unique(children));\n            },\n            remove: function () {\n                for (var i = 0; i < this.length; i++) {\n                    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n                }\n                return this;\n            },\n            detach: function () {\n                return this.remove();\n            },\n            add: function () {\n                var dom = this;\n                var i, j;\n                for (i = 0; i < arguments.length; i++) {\n                    var toAdd = $(arguments[i]);\n                    for (j = 0; j < toAdd.length; j++) {\n                        dom[dom.length] = toAdd[j];\n                        dom.length++;\n                    }\n                }\n                return dom;\n            },\n            empty: function () {\n                for (var i = 0; i < this.length; i++) {\n                    var el = this[i];\n                    if (el.nodeType === 1) {\n                        for (var j = 0; j < el.childNodes.length; j++) {\n                            if (el.childNodes[j].parentNode) el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n                        }\n                        el.textContent = '';\n                    }\n                }\n                return this;\n            }\n        };\n        \n        // Shortcuts\n        (function () {\n            var shortcuts = ('click blur focus focusin focusout keyup keydown keypress submit change mousedown mousemove mouseup mouseenter mouseleave mouseout mouseover touchstart touchend touchmove resize scroll').split(' ');\n            var notTrigger = ('resize scroll').split(' ');\n            function createMethod(name) {\n                Dom7.prototype[name] = function (targetSelector, listener, capture) {\n                    var i;\n                    if (typeof targetSelector === 'undefined') {\n                        for (i = 0; i < this.length; i++) {\n                            if (notTrigger.indexOf(name) < 0) {\n                                if (name in this[i]) this[i][name]();\n                                else {\n                                    $(this[i]).trigger(name);\n                                }\n                            }\n                        }\n                        return this;\n                    }\n                    else {\n                        return this.on(name, targetSelector, listener, capture);\n                    }\n                };\n            }\n            for (var i = 0; i < shortcuts.length; i++) {\n                createMethod(shortcuts[i]);\n            }\n        })();\n        \n\n        // Global Ajax Setup\n        var globalAjaxOptions = {};\n        $.ajaxSetup = function (options) {\n            if (options.type) options.method = options.type;\n            $.each(options, function (optionName, optionValue) {\n                globalAjaxOptions[optionName]  = optionValue;\n            });\n        };\n        \n        // Ajax\n        var _jsonpRequests = 0;\n        $.ajax = function (options) {\n            var defaults = {\n                method: 'GET',\n                data: false,\n                async: true,\n                cache: true,\n                user: '',\n                password: '',\n                headers: {},\n                xhrFields: {},\n                statusCode: {},\n                processData: true,\n                dataType: 'text',\n                contentType: 'application/x-www-form-urlencoded',\n                timeout: 0\n            };\n            var callbacks = ['beforeSend', 'error', 'complete', 'success', 'statusCode'];\n        \n        \n            //For jQuery guys\n            if (options.type) options.method = options.type;\n        \n            // Merge global and defaults\n            $.each(globalAjaxOptions, function (globalOptionName, globalOptionValue) {\n                if (callbacks.indexOf(globalOptionName) < 0) defaults[globalOptionName] = globalOptionValue;\n            });\n        \n            // Function to run XHR callbacks and events\n            function fireAjaxCallback (eventName, eventData, callbackName) {\n                var a = arguments;\n                if (eventName) $(document).trigger(eventName, eventData);\n                if (callbackName) {\n                    // Global callback\n                    if (callbackName in globalAjaxOptions) globalAjaxOptions[callbackName](a[3], a[4], a[5], a[6]);\n                    // Options callback\n                    if (options[callbackName]) options[callbackName](a[3], a[4], a[5], a[6]);\n                }\n            }\n        \n            // Merge options and defaults\n            $.each(defaults, function (prop, defaultValue) {\n                if (!(prop in options)) options[prop] = defaultValue;\n            });\n        \n            // Default URL\n            if (!options.url) {\n                options.url = window.location.toString();\n            }\n            // Parameters Prefix\n            var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?';\n        \n            // UC method\n            var _method = options.method.toUpperCase();\n            // Data to modify GET URL\n            if ((_method === 'GET' || _method === 'HEAD' || _method === 'OPTIONS' || _method === 'DELETE') && options.data) {\n                var stringData;\n                if (typeof options.data === 'string') {\n                    // Should be key=value string\n                    if (options.data.indexOf('?') >= 0) stringData = options.data.split('?')[1];\n                    else stringData = options.data;\n                }\n                else {\n                    // Should be key=value object\n                    stringData = $.serializeObject(options.data);\n                }\n                if (stringData.length) {\n                    options.url += paramsPrefix + stringData;\n                    if (paramsPrefix === '?') paramsPrefix = '&';\n                }\n            }\n            // JSONP\n            if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {\n        \n                var callbackName = 'f7jsonp_' + Date.now() + (_jsonpRequests++);\n                var abortTimeout;\n                var callbackSplit = options.url.split('callback=');\n                var requestUrl = callbackSplit[0] + 'callback=' + callbackName;\n                if (callbackSplit[1].indexOf('&') >= 0) {\n                    var addVars = callbackSplit[1].split('&').filter(function (el) { return el.indexOf('=') > 0; }).join('&');\n                    if (addVars.length > 0) requestUrl += '&' + addVars;\n                }\n        \n                // Create script\n                var script = document.createElement('script');\n                script.type = 'text/javascript';\n                script.onerror = function() {\n                    clearTimeout(abortTimeout);\n                    fireAjaxCallback(undefined, undefined, 'error', null, 'scripterror');\n                };\n                script.src = requestUrl;\n        \n                // Handler\n                window[callbackName] = function (data) {\n                    clearTimeout(abortTimeout);\n                    fireAjaxCallback(undefined, undefined, 'success', data);\n                    script.parentNode.removeChild(script);\n                    script = null;\n                    delete window[callbackName];\n                };\n                document.querySelector('head').appendChild(script);\n        \n                if (options.timeout > 0) {\n                    abortTimeout = setTimeout(function () {\n                        script.parentNode.removeChild(script);\n                        script = null;\n                        fireAjaxCallback(undefined, undefined, 'error', null, 'timeout');\n                    }, options.timeout);\n                }\n        \n                return;\n            }\n        \n            // Cache for GET/HEAD requests\n            if (_method === 'GET' || _method === 'HEAD' || _method === 'OPTIONS' || _method === 'DELETE') {\n                if (options.cache === false) {\n                    options.url += (paramsPrefix + '_nocache=' + Date.now());\n                }\n            }\n        \n            // Create XHR\n            var xhr = new XMLHttpRequest();\n        \n            // Save Request URL\n            xhr.requestUrl = options.url;\n            xhr.requestParameters = options;\n        \n            // Open XHR\n            xhr.open(_method, options.url, options.async, options.user, options.password);\n        \n            // Create POST Data\n            var postData = null;\n        \n            if ((_method === 'POST' || _method === 'PUT' || _method === 'PATCH') && options.data) {\n                if (options.processData) {\n                    var postDataInstances = [ArrayBuffer, Blob, Document, FormData];\n                    // Post Data\n                    if (postDataInstances.indexOf(options.data.constructor) >= 0) {\n                        postData = options.data;\n                    }\n                    else {\n                        // POST Headers\n                        var boundary = '---------------------------' + Date.now().toString(16);\n        \n                        if (options.contentType === 'multipart\\/form-data') {\n                            xhr.setRequestHeader('Content-Type', 'multipart\\/form-data; boundary=' + boundary);\n                        }\n                        else {\n                            xhr.setRequestHeader('Content-Type', options.contentType);\n                        }\n                        postData = '';\n                        var _data = $.serializeObject(options.data);\n                        if (options.contentType === 'multipart\\/form-data') {\n                            boundary = '---------------------------' + Date.now().toString(16);\n                            _data = _data.split('&');\n                            var _newData = [];\n                            for (var i = 0; i < _data.length; i++) {\n                                _newData.push('Content-Disposition: form-data; name=\"' + _data[i].split('=')[0] + '\"\\r\\n\\r\\n' + _data[i].split('=')[1] + '\\r\\n');\n                            }\n                            postData = '--' + boundary + '\\r\\n' + _newData.join('--' + boundary + '\\r\\n') + '--' + boundary + '--\\r\\n';\n                        }\n                        else {\n                            postData = options.contentType === 'application/x-www-form-urlencoded' ? _data : _data.replace(/&/g, '\\r\\n');\n                        }\n                    }\n                }\n                else {\n                    postData = options.data;\n                }\n        \n            }\n        \n            // Additional headers\n            if (options.headers) {\n                $.each(options.headers, function (headerName, headerCallback) {\n                    xhr.setRequestHeader(headerName, headerCallback);\n                });\n            }\n        \n            // Check for crossDomain\n            if (typeof options.crossDomain === 'undefined') {\n                options.crossDomain = /^([\\w-]+:)?\\/\\/([^\\/]+)/.test(options.url) && RegExp.$2 !== window.location.host;\n            }\n        \n            if (!options.crossDomain) {\n                xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n            }\n        \n            if (options.xhrFields) {\n                $.each(options.xhrFields, function (fieldName, fieldValue) {\n                    xhr[fieldName] = fieldValue;\n                });\n            }\n        \n            var xhrTimeout;\n            // Handle XHR\n            xhr.onload = function (e) {\n                if (xhrTimeout) clearTimeout(xhrTimeout);\n                if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {\n                    var responseData;\n                    if (options.dataType === 'json') {\n                        try {\n                            responseData = JSON.parse(xhr.responseText);\n                            fireAjaxCallback('ajaxSuccess', {xhr: xhr}, 'success', responseData, xhr.status, xhr);\n                        }\n                        catch (err) {\n                            fireAjaxCallback('ajaxError', {xhr: xhr, parseerror: true}, 'error', xhr, 'parseerror');\n                        }\n                    }\n                    else {\n                        responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;\n                        fireAjaxCallback('ajaxSuccess', {xhr: xhr}, 'success', responseData, xhr.status, xhr);\n                    }\n                }\n                else {\n                    fireAjaxCallback('ajaxError', {xhr: xhr}, 'error', xhr, xhr.status);\n                }\n                if (options.statusCode) {\n                    if (globalAjaxOptions.statusCode && globalAjaxOptions.statusCode[xhr.status]) globalAjaxOptions.statusCode[xhr.status](xhr);\n                    if (options.statusCode[xhr.status]) options.statusCode[xhr.status](xhr);\n                }\n                fireAjaxCallback('ajaxComplete', {xhr: xhr}, 'complete', xhr, xhr.status);\n            };\n        \n            xhr.onerror = function (e) {\n                if (xhrTimeout) clearTimeout(xhrTimeout);\n                fireAjaxCallback('ajaxError', {xhr: xhr}, 'error', xhr, xhr.status);\n            };\n        \n            // Ajax start callback\n            fireAjaxCallback('ajaxStart', {xhr: xhr}, 'start', xhr);\n            fireAjaxCallback(undefined, undefined, 'beforeSend', xhr);\n        \n            // Timeout\n            if (options.timeout > 0) {\n                xhr.onabort = function () {\n                    if (xhrTimeout) clearTimeout(xhrTimeout);\n                };\n                xhrTimeout = setTimeout(function () {\n                    xhr.abort();\n                    fireAjaxCallback('ajaxError', {xhr: xhr, timeout: true}, 'error', xhr, 'timeout');\n                    fireAjaxCallback('ajaxComplete', {xhr: xhr, timeout: true}, 'complete', xhr, 'timeout');\n                }, options.timeout);\n            }\n        \n            // Send XHR\n            xhr.send(postData);\n        \n            // Return XHR object\n            return xhr;\n        };\n        // Shrotcuts\n        (function () {\n            var methods = ('get post getJSON').split(' ');\n            function createMethod(method) {\n                $[method] = function (url, data, success, error) {\n                    return $.ajax({\n                        url: url,\n                        method: method === 'post' ? 'POST' : 'GET',\n                        data: typeof data === 'function' ? undefined : data,\n                        success: typeof data === 'function' ? data : success,\n                        error: typeof data === 'function' ? success : error,\n                        dataType: method === 'getJSON' ? 'json' : undefined\n                    });\n                };\n            }\n            for (var i = 0; i < methods.length; i++) {\n                createMethod(methods[i]);\n            }\n        })();\n        \n\n        // DOM Library Utilites\n        $.parseUrlQuery = function (url) {\n           var url = url || location.href;\n            var query = {}, i, params, param;\n        \n            if (typeof url === 'string' && url.length)  {\n                url = (url.indexOf('#') > -1) ? url.split('#')[0] : url;\n                if (url.indexOf('?') > -1) url = url.split('?')[1];\n                else return query;\n        \n                params = url.split('&');\n                for (i = 0; i < params.length; i ++) {\n                    param = params[i].split('=');\n                    query[param[0]] = param[1];\n                }\n            }\n            return query;\n        };\n        $.isArray = function (arr) {\n            if (Object.prototype.toString.apply(arr) === '[object Array]') return true;\n            else return false;\n        };\n        $.each = function (obj, callback) {\n            if (typeof obj !== 'object') return;\n            if (!callback) return;\n            var i, prop;\n            if ($.isArray(obj) || obj instanceof Dom7) {\n                // Array\n                for (i = 0; i < obj.length; i++) {\n                    callback(i, obj[i]);\n                }\n            }\n            else {\n                // Object\n                for (prop in obj) {\n                    if (obj.hasOwnProperty(prop)) {\n                        callback(prop, obj[prop]);\n                    }\n                }\n            }\n        };\n        $.unique = function (arr) {\n            var unique = [];\n            for (var i = 0; i < arr.length; i++) {\n                if (unique.indexOf(arr[i]) === -1) unique.push(arr[i]);\n            }\n            return unique;\n        };\n        $.serializeObject = $.param = function (obj, parents) {\n            if (typeof obj === 'string') return obj;\n            var resultArray = [];\n            var separator = '&';\n            parents = parents || [];\n            var newParents;\n            function var_name(name) {\n                if (parents.length > 0) {\n                    var _parents = '';\n                    for (var j = 0; j < parents.length; j++) {\n                        if (j === 0) _parents += parents[j];\n                        else _parents += '[' + encodeURIComponent(parents[j]) + ']';\n                    }\n                    return _parents + '[' + encodeURIComponent(name) + ']';\n                }\n                else {\n                    return encodeURIComponent(name);\n                }\n            }\n            function var_value(value) {\n                return encodeURIComponent(value);\n            }\n            for (var prop in obj) {\n                if (obj.hasOwnProperty(prop)) {\n                    var toPush;\n                    if ($.isArray(obj[prop])) {\n                        toPush = [];\n                        for (var i = 0; i < obj[prop].length; i ++) {\n                            if (!$.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {\n                                newParents = parents.slice();\n                                newParents.push(prop);\n                                newParents.push(i + '');\n                                toPush.push($.serializeObject(obj[prop][i], newParents));\n                            }\n                            else {\n                                toPush.push(var_name(prop) + '[]=' + var_value(obj[prop][i]));\n                            }\n        \n                        }\n                        if (toPush.length > 0) resultArray.push(toPush.join(separator));\n                    }\n                    else if (obj[prop] === null) {\n                        resultArray.push(var_name(prop) + '=');\n                    }\n                    else if (typeof obj[prop] === 'object') {\n                        // Object, convert to named array\n                        newParents = parents.slice();\n                        newParents.push(prop);\n                        toPush = $.serializeObject(obj[prop], newParents);\n                        if (toPush !== '') resultArray.push(toPush);\n                    }\n                    else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {\n                        // Should be string or plain value\n                        resultArray.push(var_name(prop) + '=' + var_value(obj[prop]));\n                    }\n                }\n            }\n            return resultArray.join(separator);\n        };\n        $.toCamelCase = function (string) {\n            return string.toLowerCase().replace(/-(.)/g, function(match, group1) {\n                return group1.toUpperCase();\n            });\n        };\n        $.dataset = function (el) {\n            return $(el).dataset();\n        };\n        $.getTranslate = function (el, axis) {\n            var matrix, curTransform, curStyle, transformMatrix;\n        \n            // automatic axis detection\n            if (typeof axis === 'undefined') {\n                axis = 'x';\n            }\n        \n            curStyle = window.getComputedStyle(el, null);\n            if (window.WebKitCSSMatrix) {\n                curTransform = curStyle.transform || curStyle.webkitTransform;\n                if (curTransform.split(',').length > 6) {\n                    curTransform = curTransform.split(', ').map(function(a){\n                        return a.replace(',','.');\n                    }).join(', ');\n                }\n                // Some old versions of Webkit choke when 'none' is passed; pass\n                // empty string instead in this case\n                transformMatrix = new WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n            }\n            else {\n                transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform  || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n                matrix = transformMatrix.toString().split(',');\n            }\n        \n            if (axis === 'x') {\n                //Latest Chrome and webkits Fix\n                if (window.WebKitCSSMatrix)\n                    curTransform = transformMatrix.m41;\n                //Crazy IE10 Matrix\n                else if (matrix.length === 16)\n                    curTransform = parseFloat(matrix[12]);\n                //Normal Browsers\n                else\n                    curTransform = parseFloat(matrix[4]);\n            }\n            if (axis === 'y') {\n                //Latest Chrome and webkits Fix\n                if (window.WebKitCSSMatrix)\n                    curTransform = transformMatrix.m42;\n                //Crazy IE10 Matrix\n                else if (matrix.length === 16)\n                    curTransform = parseFloat(matrix[13]);\n                //Normal Browsers\n                else\n                    curTransform = parseFloat(matrix[5]);\n            }\n            \n            return curTransform || 0;\n        };\n        \n        $.requestAnimationFrame = function (callback) {\n            if (window.requestAnimationFrame) return window.requestAnimationFrame(callback);\n            else if (window.webkitRequestAnimationFrame) return window.webkitRequestAnimationFrame(callback);\n            else if (window.mozRequestAnimationFrame) return window.mozRequestAnimationFrame(callback);\n            else {\n                return window.setTimeout(callback, 1000 / 60);\n            }\n        };\n        $.cancelAnimationFrame = function (id) {\n            if (window.cancelAnimationFrame) return window.cancelAnimationFrame(id);\n            else if (window.webkitCancelAnimationFrame) return window.webkitCancelAnimationFrame(id);\n            else if (window.mozCancelAnimationFrame) return window.mozCancelAnimationFrame(id);\n            else {\n                return window.clearTimeout(id);\n            }  \n        };\n        $.supportTouch = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);\n        \n        // Remove Diacritics\n        var defaultDiacriticsRemovalap = [\n            {base:'A', letters:'\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F'},\n            {base:'AA',letters:'\\uA732'},\n            {base:'AE',letters:'\\u00C6\\u01FC\\u01E2'},\n            {base:'AO',letters:'\\uA734'},\n            {base:'AU',letters:'\\uA736'},\n            {base:'AV',letters:'\\uA738\\uA73A'},\n            {base:'AY',letters:'\\uA73C'},\n            {base:'B', letters:'\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181'},\n            {base:'C', letters:'\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E'},\n            {base:'D', letters:'\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779'},\n            {base:'DZ',letters:'\\u01F1\\u01C4'},\n            {base:'Dz',letters:'\\u01F2\\u01C5'},\n            {base:'E', letters:'\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E'},\n            {base:'F', letters:'\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B'},\n            {base:'G', letters:'\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E'},\n            {base:'H', letters:'\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D'},\n            {base:'I', letters:'\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197'},\n            {base:'J', letters:'\\u004A\\u24BF\\uFF2A\\u0134\\u0248'},\n            {base:'K', letters:'\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2'},\n            {base:'L', letters:'\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780'},\n            {base:'LJ',letters:'\\u01C7'},\n            {base:'Lj',letters:'\\u01C8'},\n            {base:'M', letters:'\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C'},\n            {base:'N', letters:'\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4'},\n            {base:'NJ',letters:'\\u01CA'},\n            {base:'Nj',letters:'\\u01CB'},\n            {base:'O', letters:'\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C'},\n            {base:'OI',letters:'\\u01A2'},\n            {base:'OO',letters:'\\uA74E'},\n            {base:'OU',letters:'\\u0222'},\n            {base:'OE',letters:'\\u008C\\u0152'},\n            {base:'oe',letters:'\\u009C\\u0153'},\n            {base:'P', letters:'\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754'},\n            {base:'Q', letters:'\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A'},\n            {base:'R', letters:'\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782'},\n            {base:'S', letters:'\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784'},\n            {base:'T', letters:'\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786'},\n            {base:'TZ',letters:'\\uA728'},\n            {base:'U', letters:'\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244'},\n            {base:'V', letters:'\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245'},\n            {base:'VY',letters:'\\uA760'},\n            {base:'W', letters:'\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72'},\n            {base:'X', letters:'\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C'},\n            {base:'Y', letters:'\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE'},\n            {base:'Z', letters:'\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762'},\n            {base:'a', letters:'\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250'},\n            {base:'aa',letters:'\\uA733'},\n            {base:'ae',letters:'\\u00E6\\u01FD\\u01E3'},\n            {base:'ao',letters:'\\uA735'},\n            {base:'au',letters:'\\uA737'},\n            {base:'av',letters:'\\uA739\\uA73B'},\n            {base:'ay',letters:'\\uA73D'},\n            {base:'b', letters:'\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253'},\n            {base:'c', letters:'\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184'},\n            {base:'d', letters:'\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A'},\n            {base:'dz',letters:'\\u01F3\\u01C6'},\n            {base:'e', letters:'\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD'},\n            {base:'f', letters:'\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C'},\n            {base:'g', letters:'\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F'},\n            {base:'h', letters:'\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265'},\n            {base:'hv',letters:'\\u0195'},\n            {base:'i', letters:'\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131'},\n            {base:'j', letters:'\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249'},\n            {base:'k', letters:'\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3'},\n            {base:'l', letters:'\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747'},\n            {base:'lj',letters:'\\u01C9'},\n            {base:'m', letters:'\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F'},\n            {base:'n', letters:'\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5'},\n            {base:'nj',letters:'\\u01CC'},\n            {base:'o', letters:'\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275'},\n            {base:'oi',letters:'\\u01A3'},\n            {base:'ou',letters:'\\u0223'},\n            {base:'oo',letters:'\\uA74F'},\n            {base:'p',letters:'\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755'},\n            {base:'q',letters:'\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759'},\n            {base:'r',letters:'\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783'},\n            {base:'s',letters:'\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B'},\n            {base:'t',letters:'\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787'},\n            {base:'tz',letters:'\\uA729'},\n            {base:'u',letters: '\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289'},\n            {base:'v',letters:'\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C'},\n            {base:'vy',letters:'\\uA761'},\n            {base:'w',letters:'\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73'},\n            {base:'x',letters:'\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D'},\n            {base:'y',letters:'\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF'},\n            {base:'z',letters:'\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763'}\n        ];\n        \n        var diacriticsMap = {};\n        for (var i=0; i < defaultDiacriticsRemovalap.length; i++){\n            var letters = defaultDiacriticsRemovalap[i].letters;\n            for (var j=0; j < letters.length ; j++){\n                diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;\n            }\n        }\n        \n        $.removeDiacritics = function (str) {\n            return str.replace(/[^\\u0000-\\u007E]/g, function(a){\n               return diacriticsMap[a] || a;\n            });\n        };\n        // Link to prototype\n        $.fn = Dom7.prototype;\n        \n        // Plugins\n        $.fn.scrollTo = function (left, top, duration, easing, callback) {\n            if (arguments.length === 4 && typeof easing === 'function') {\n                callback = easing;\n                easing = undefined;\n            }\n            return this.each(function () {\n                var el = this;\n                var currentTop, currentLeft, maxTop, maxLeft, newTop, newLeft, scrollTop, scrollLeft;\n                var animateTop = top > 0 || top === 0;\n                var animateLeft = left > 0 || left === 0;\n                if (typeof easing === 'undefined') {\n                    easing = 'swing';\n                }\n                if (animateTop) {\n                    currentTop = el.scrollTop;\n                    if (!duration) {\n                        el.scrollTop = top;\n                    }\n                }\n                if (animateLeft) {\n                    currentLeft = el.scrollLeft;\n                    if (!duration) {\n                        el.scrollLeft = left;\n                    }\n                }\n                if (!duration) return;\n                if (animateTop) {\n                    maxTop = el.scrollHeight - el.offsetHeight;\n                    newTop = Math.max(Math.min(top, maxTop), 0);\n                }\n                if (animateLeft) {\n                    maxLeft = el.scrollWidth - el.offsetWidth;\n                    newLeft = Math.max(Math.min(left, maxLeft), 0);\n                }\n                var startTime = null;\n                if (animateTop && newTop === currentTop) animateTop = false;\n                if (animateLeft && newLeft === currentLeft) animateLeft = false;\n                function render(time) {\n                    if (time === undefined) {\n                        time = new Date().getTime();\n                    }\n                    if (startTime === null) {\n                        startTime = time;\n                    }\n                    var doneLeft, doneTop, done;\n                    var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n                    var easeProgress = easing === 'linear' ? progress : (0.5 - Math.cos( progress * Math.PI ) / 2);\n                    if (animateTop) scrollTop = currentTop + (easeProgress * (newTop - currentTop));\n                    if (animateLeft) scrollLeft = currentLeft + (easeProgress * (newLeft - currentLeft));\n                    if (animateTop && newTop > currentTop && scrollTop >= newTop)  {\n                        el.scrollTop = newTop;\n                        done = true;\n                    }\n                    if (animateTop && newTop < currentTop && scrollTop <= newTop)  {\n                        el.scrollTop = newTop;\n                        done = true;\n                    }\n        \n                    if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft)  {\n                        el.scrollLeft = newLeft;\n                        done = true;\n                    }\n                    if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft)  {\n                        el.scrollLeft = newLeft;\n                        done = true;\n                    }\n        \n                    if (done) {\n                        if (callback) callback();\n                        return;\n                    }\n                    if (animateTop) el.scrollTop = scrollTop;\n                    if (animateLeft) el.scrollLeft = scrollLeft;\n                    $.requestAnimationFrame(render);\n                }\n                $.requestAnimationFrame(render);\n            });\n        };\n        $.fn.scrollTop = function (top, duration, easing, callback) {\n            if (arguments.length === 3 && typeof easing === 'function') {\n                callback = easing;\n                easing = undefined;\n            }\n            var dom = this;\n            if (typeof top === 'undefined') {\n                if (dom.length > 0) return dom[0].scrollTop;\n                else return null;\n            }\n            return dom.scrollTo(undefined, top, duration, easing, callback);\n        };\n        $.fn.scrollLeft = function (left, duration, easing, callback) {\n            if (arguments.length === 3 && typeof easing === 'function') {\n                callback = easing;\n                easing = undefined;\n            }\n            var dom = this;\n            if (typeof left === 'undefined') {\n                if (dom.length > 0) return dom[0].scrollLeft;\n                else return null;\n            }\n            return dom.scrollTo(left, undefined, duration, easing, callback);\n        };\n\n        return $;\n    })();\n    \n    // Export Dom7 to Framework7\n    Framework7.$ = Dom7;\n    \n    // Export to local scope\n    var $ = Dom7;\n    \n    // Export to Window\n    window.Dom7 = Dom7;\n    \n\n    /*========================\n    Animate7 Animate Engine\n    ==========================*/\n    var Animate7 = function (elements, props, params) {\n        props = props || {};\n        params = params || {};\n        var defaults = {\n            duration: 300,\n            easing: 'swing', // or 'linear'\n            /* Callbacks\n            begin(elements)\n            complete(elements)\n            progress(elements, complete, remaining, start, tweenValue)\n            */\n        };\n    \n        for (var def in defaults) {\n            if (typeof params[def] === 'undefined') {\n                params[def] = defaults[def];\n            }\n        }\n    \n        var a = this;\n        a.params = params;\n        a.props = props;\n        a.elements = $(elements);\n        if (a.elements.length === 0) {\n            return a;\n        }\n    \n        a.easingProgress = function (easing, progress) {\n            if (easing === 'swing') {\n                return 0.5 - Math.cos( progress * Math.PI ) / 2;\n            }\n            if (typeof easing === 'function') {\n                return easing(progress);\n            }\n            return progress;\n        };\n    \n        a.stop = function () {\n            if (a.frameId) {\n                $.cancelAnimationFrame(a.frameId);\n            }\n            a.animating = false;\n            a.elements.each(function (index, el) {\n                delete el.animate7Instance;\n            });\n            a.que = [];\n        };\n        a.done = function (complete) {\n            a.animating = false;\n            a.elements.each(function (index, el) {\n                delete el.animate7Instance;\n            });\n            if (complete) complete(elements);\n            if (a.que.length > 0) {\n                var que = a.que.shift();\n                a.animate(que[0], que[1]);\n            }\n        };\n        a.animating = false;\n        a.que = [];\n        a.animate = function (props, params) {\n            if (a.animating) {\n                a.que.push([props, params]);\n                return a;\n            }\n            a.params = params;\n    \n            var _elements = [];\n    \n            // Define & Cache Initials & Units\n            a.elements.each(function (index, el) {\n                var initialFullValue, initialValue, unit, finalValue, finalFullValue;\n    \n                _elements[index] = {\n                    _container: el\n                };\n    \n                for (var prop in props) {\n                    initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n                    initialValue = parseFloat(initialFullValue);\n                    unit = initialFullValue.replace(initialValue, '');\n                    finalValue = props[prop];\n                    finalFullValue = props[prop] + unit;\n                    _elements[index][prop] = {\n                        initialFullValue: initialFullValue,\n                        initialValue: initialValue,\n                        unit: unit,\n                        finalValue: finalValue,\n                        finalFullValue: finalFullValue,\n                        currentValue: initialValue\n                    };\n    \n                }\n            });\n    \n            var startTime = null,\n                time,\n                elementsDone = 0,\n                propsDone = 0,\n                done,\n                began = false;\n    \n            a.animating = true;\n    \n            function render() {\n                time = new Date().getTime();\n                var progress, easeProgress, el;\n                if (!began) {\n                    began = true;\n                    if (params.begin) params.begin(elements);\n                }\n                if (startTime === null) {\n                    startTime = time;\n                }\n                if (params.progress) {\n                    params.progress(\n                        a.elements,\n                        Math.max(Math.min((time - startTime) / params.duration, 1), 0),\n                        ((startTime + params.duration) - time < 0 ? 0 : (startTime + params.duration) - time),\n                        startTime\n                    );\n                }\n    \n                for (var i = 0; i < _elements.length; i++) {\n                    if (done) continue;\n                    el = _elements[i];\n                    if (el.done) continue;\n    \n                    for (var prop in props) {\n                        progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n                        easeProgress = a.easingProgress(params.easing, progress);\n    \n                        el[prop].currentValue = el[prop].initialValue + easeProgress * (el[prop].finalValue - el[prop].initialValue);\n    \n                        if (el[prop].finalValue > el[prop].initialValue && el[prop].currentValue >= el[prop].finalValue || el[prop].finalValue < el[prop].initialValue && el[prop].currentValue <= el[prop].finalValue)  {\n                            el._container.style[prop] = el[prop].finalValue + el[prop].unit;\n                            propsDone ++;\n                            if (propsDone === Object.keys(props).length) {\n                                el.done = true;\n                                elementsDone++;\n                            }\n                            if (elementsDone === _elements.length) {\n                                done = true;\n                            }\n                        }\n                        if (done) {\n                            a.done(params.complete);\n                            return a;\n                        }\n                        el._container.style[prop] = el[prop].currentValue + el[prop].unit;\n                    }\n                }\n    \n                // Then call\n                a.frameId = $.requestAnimationFrame(render);\n            }\n            a.frameId = $.requestAnimationFrame(render);\n            return a;\n        };\n        var foundInstance;\n        for (var i = 0; i < a.elements.length; i++) {\n            if (a.elements[i].animate7Instance) {\n                foundInstance = a.elements[i].animate7Instance;\n            }\n            else a.elements[i].animate7Instance = a;\n        }\n        if (foundInstance) {\n            return foundInstance.animate(props, params);\n        }\n        else a.animate(props, params);\n        return a;\n    };\n    window.Animate7 = function (elements, props, params){\n        return new Animate7(elements, props, params);\n    };\n    Dom7.fn.animate = function (props, params) {\n        new Animate7(this, props, params);\n        return this;\n    };\n\n    /*===========================\n    Features Support Detection\n    ===========================*/\n    Framework7.prototype.support = (function () {\n        var support = {\n            touch: !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch),\n            passiveListener: (function () {\n                var supportsPassive = false;\n                try {\n                    var opts = Object.defineProperty({}, 'passive', {\n                        get: function() {\n                            supportsPassive = true;\n                        }\n                    });\n                    window.addEventListener('testPassiveListener', null, opts);\n                } catch (e) {}\n                return supportsPassive;\n            })()\n        };\n    \n        // Export object\n        return support;\n    })();\n    \n\n    /*===========================\n    Device/OS Detection\n    ===========================*/\n    Framework7.prototype.device = (function () {\n        var device = {};\n        var ua = navigator.userAgent;\n        var $ = Dom7;\n    \n        var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\n        var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n        var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n        var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n    \n        device.ios = device.android = device.iphone = device.ipad = device.androidChrome = false;\n        \n        // Android\n        if (android) {\n            device.os = 'android';\n            device.osVersion = android[2];\n            device.android = true;\n            device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;\n        }\n        if (ipad || iphone || ipod) {\n            device.os = 'ios';\n            device.ios = true;\n        }\n        // iOS\n        if (iphone && !ipod) {\n            device.osVersion = iphone[2].replace(/_/g, '.');\n            device.iphone = true;\n        }\n        if (ipad) {\n            device.osVersion = ipad[2].replace(/_/g, '.');\n            device.ipad = true;\n        }\n        if (ipod) {\n            device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n            device.iphone = true;\n        }\n        // iOS 8+ changed UA\n        if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {\n            if (device.osVersion.split('.')[0] === '10') {\n                device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];\n            }\n        }\n    \n        // Webview\n        device.webView = (iphone || ipad || ipod) && ua.match(/.*AppleWebKit(?!.*Safari)/i);\n            \n        // Minimal UI\n        if (device.os && device.os === 'ios') {\n            var osVersionArr = device.osVersion.split('.');\n            device.minimalUi = !device.webView &&\n                                (ipod || iphone) &&\n                                (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7) &&\n                                $('meta[name=\"viewport\"]').length > 0 && $('meta[name=\"viewport\"]').attr('content').indexOf('minimal-ui') >= 0;\n        }\n    \n        // Check for status bar and fullscreen app mode\n        var windowWidth = $(window).width();\n        var windowHeight = $(window).height();\n        device.statusBar = false;\n        if (device.webView && (windowWidth * windowHeight === screen.width * screen.height)) {\n            device.statusBar = true;\n        }\n        else {\n            device.statusBar = false;\n        }\n    \n        // Classes\n        var classNames = [];\n    \n        // Pixel Ratio\n        device.pixelRatio = window.devicePixelRatio || 1;\n        classNames.push('pixel-ratio-' + Math.floor(device.pixelRatio));\n        if (device.pixelRatio >= 2) {\n            classNames.push('retina');\n        }\n    \n        // OS classes\n        if (device.os) {\n            classNames.push(device.os, device.os + '-' + device.osVersion.split('.')[0], device.os + '-' + device.osVersion.replace(/\\./g, '-'));\n            if (device.os === 'ios') {\n                var major = parseInt(device.osVersion.split('.')[0], 10);\n                for (var i = major - 1; i >= 6; i--) {\n                    classNames.push('ios-gt-' + i);\n                }\n            }\n            \n        }\n        // Status bar classes\n        if (device.statusBar) {\n            classNames.push('with-statusbar-overlay');\n        }\n        else {\n            $('html').removeClass('with-statusbar-overlay');\n        }\n    \n        // Add html classes\n        if (classNames.length > 0) $('html').addClass(classNames.join(' '));\n    \n        // Export object\n        return device;\n    })();\n    \n\n    /*===========================\n    Plugins prototype\n    ===========================*/\n    Framework7.prototype.plugins = {};\n    \n\n    /*===========================\n    Template7 Template engine\n    ===========================*/\n    window.Template7 = (function () {\n        'use strict';\n        function isArray(arr) {\n            return Object.prototype.toString.apply(arr) === '[object Array]';\n        }\n        function isObject(obj) {\n            return obj instanceof Object;\n        }\n        function isFunction(func) {\n            return typeof func === 'function';\n        }\n        function _escape(string) {\n            return typeof window !== 'undefined' && window.escape ? window.escape(string) : string\n                .replace(/&/g, '&amp;')\n                .replace(/</g, '&lt;')\n                .replace(/>/g, '&gt;')\n                .replace(/\"/g, '&quot;');\n        }\n        var cache = {};\n        var quoteSingleRexExp = new RegExp('\\'', 'g');\n        var quoteDoubleRexExp = new RegExp('\"', 'g');\n        function helperToSlices(string) {\n            var helperParts = string.replace(/[{}#}]/g, '').split(' ');\n            var slices = [];\n            var shiftIndex, i, j;\n            for (i = 0; i < helperParts.length; i++) {\n                var part = helperParts[i];\n                var blockQuoteRegExp, openingQuote;\n                if (i === 0) slices.push(part);\n                else {\n                    if (part.indexOf('\"') === 0 || part.indexOf('\\'') === 0) {\n                        blockQuoteRegExp = part.indexOf('\"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;\n                        openingQuote = part.indexOf('\"') === 0 ? '\"' : '\\'';\n                        // Plain String\n                        if (part.match(blockQuoteRegExp).length === 2) {\n                            // One word string\n                            slices.push(part);\n                        }\n                        else {\n                            // Find closed Index\n                            shiftIndex = 0;\n                            for (j = i + 1; j < helperParts.length; j++) {\n                                part += ' ' + helperParts[j];\n                                if (helperParts[j].indexOf(openingQuote) >= 0) {\n                                    shiftIndex = j;\n                                    slices.push(part);\n                                    break;\n                                }\n                            }\n                            if (shiftIndex) i = shiftIndex;\n                        }\n                    }\n                    else {\n                        if (part.indexOf('=') > 0) {\n                            // Hash\n                            var hashParts = part.split('=');\n                            var hashName = hashParts[0];\n                            var hashContent = hashParts[1];\n                            if (hashContent.match(blockQuoteRegExp).length !== 2) {\n                                shiftIndex = 0;\n                                for (j = i + 1; j < helperParts.length; j++) {\n                                    hashContent += ' ' + helperParts[j];\n                                    if (helperParts[j].indexOf(openingQuote) >= 0) {\n                                        shiftIndex = j;\n                                        break;\n                                    }\n                                }\n                                if (shiftIndex) i = shiftIndex;\n                            }\n                            var hash = [hashName, hashContent.replace(blockQuoteRegExp,'')];\n                            slices.push(hash);\n                        }\n                        else {\n                            // Plain variable\n                            slices.push(part);\n                        }\n                    }\n                }\n            }\n            return slices;\n        }\n        function stringToBlocks(string) {\n            var blocks = [], i, j, k;\n            if (!string) return [];\n            var _blocks = string.split(/({{[^{^}]*}})/);\n            for (i = 0; i < _blocks.length; i++) {\n                var block = _blocks[i];\n                if (block === '') continue;\n                if (block.indexOf('{{') < 0) {\n                    blocks.push({\n                        type: 'plain',\n                        content: block\n                    });\n                }\n                else {\n                    if (block.indexOf('{/') >= 0) {\n                        continue;\n                    }\n                    if (block.indexOf('{#') < 0 && block.indexOf(' ') < 0 && block.indexOf('else') < 0) {\n                        // Simple variable\n                        blocks.push({\n                            type: 'variable',\n                            contextName: block.replace(/[{}]/g, '')\n                        });\n                        continue;\n                    }\n                    // Helpers\n                    var helperSlices = helperToSlices(block);\n                    var helperName = helperSlices[0];\n                    var isPartial = helperName === '>';\n                    var helperContext = [];\n                    var helperHash = {};\n                    for (j = 1; j < helperSlices.length; j++) {\n                        var slice = helperSlices[j];\n                        if (isArray(slice)) {\n                            // Hash\n                            helperHash[slice[0]] = slice[1] === 'false' ? false : slice[1];\n                        }\n                        else {\n                            helperContext.push(slice);\n                        }\n                    }\n    \n                    if (block.indexOf('{#') >= 0) {\n                        // Condition/Helper\n                        var helperStartIndex = i;\n                        var helperContent = '';\n                        var elseContent = '';\n                        var toSkip = 0;\n                        var shiftIndex;\n                        var foundClosed = false, foundElse = false, foundClosedElse = false, depth = 0;\n                        for (j = i + 1; j < _blocks.length; j++) {\n                            if (_blocks[j].indexOf('{{#') >= 0) {\n                                depth ++;\n                            }\n                            if (_blocks[j].indexOf('{{/') >= 0) {\n                                depth --;\n                            }\n                            if (_blocks[j].indexOf('{{#' + helperName) >= 0) {\n                                helperContent += _blocks[j];\n                                if (foundElse) elseContent += _blocks[j];\n                                toSkip ++;\n                            }\n                            else if (_blocks[j].indexOf('{{/' + helperName) >= 0) {\n                                if (toSkip > 0) {\n                                    toSkip--;\n                                    helperContent += _blocks[j];\n                                    if (foundElse) elseContent += _blocks[j];\n                                }\n                                else {\n                                    shiftIndex = j;\n                                    foundClosed = true;\n                                    break;\n                                }\n                            }\n                            else if (_blocks[j].indexOf('else') >= 0 && depth === 0) {\n                                foundElse = true;\n                            }\n                            else {\n                                if (!foundElse) helperContent += _blocks[j];\n                                if (foundElse) elseContent += _blocks[j];\n                            }\n    \n                        }\n                        if (foundClosed) {\n                            if (shiftIndex) i = shiftIndex;\n                            blocks.push({\n                                type: 'helper',\n                                helperName: helperName,\n                                contextName: helperContext,\n                                content: helperContent,\n                                inverseContent: elseContent,\n                                hash: helperHash\n                            });\n                        }\n                    }\n                    else if (block.indexOf(' ') > 0) {\n                        if (isPartial) {\n                            helperName = '_partial';\n                            if (helperContext[0]) helperContext[0] = '\"' + helperContext[0].replace(/\"|'/g, '') + '\"';\n                        }\n                        blocks.push({\n                            type: 'helper',\n                            helperName: helperName,\n                            contextName: helperContext,\n                            hash: helperHash\n                        });\n                    }\n                }\n            }\n            return blocks;\n        }\n        var Template7 = function (template, options) {\n            var t = this;\n            t.template = template;\n    \n            function getCompileFn(block, depth) {\n                if (block.content) return compile(block.content, depth);\n                else return function () {return ''; };\n            }\n            function getCompileInverse(block, depth) {\n                if (block.inverseContent) return compile(block.inverseContent, depth);\n                else return function () {return ''; };\n            }\n            function getCompileVar(name, ctx) {\n                var variable, parts, levelsUp = 0, initialCtx = ctx;\n                if (name.indexOf('../') === 0) {\n                    levelsUp = name.split('../').length - 1;\n                    var newDepth = ctx.split('_')[1] - levelsUp;\n                    ctx = 'ctx_' + (newDepth >= 1 ? newDepth : 1);\n                    parts = name.split('../')[levelsUp].split('.');\n                }\n                else if (name.indexOf('@global') === 0) {\n                    ctx = 'Template7.global';\n                    parts = name.split('@global.')[1].split('.');\n                }\n                else if (name.indexOf('@root') === 0) {\n                    ctx = 'root';\n                    parts = name.split('@root.')[1].split('.');\n                }\n                else {\n                    parts = name.split('.');\n                }\n                variable = ctx;\n                for (var i = 0; i < parts.length; i++) {\n                    var part = parts[i];\n                    if (part.indexOf('@') === 0) {\n                        if (i > 0) {\n                            variable += '[(data && data.' + part.replace('@', '') + ')]';\n                        }\n                        else {\n                            variable = '(data && data.' + name.replace('@', '') + ')';\n                        }\n                    }\n                    else {\n                        if (isFinite(part)) {\n                            variable += '[' + part + ']';\n                        }\n                        else {\n                            if (part === 'this' || part.indexOf('this.') >= 0 || part.indexOf('this[') >= 0 || part.indexOf('this(') >= 0) {\n                                variable = part.replace('this', ctx);\n                            }\n                            else {\n                                variable += '.' + part;\n                            }\n                        }\n                    }\n                }\n    \n                return variable;\n            }\n            function getCompiledArguments(contextArray, ctx) {\n                var arr = [];\n                for (var i = 0; i < contextArray.length; i++) {\n                    if (/^['\"]/.test(contextArray[i])) arr.push(contextArray[i]);\n                    else if (/^(true|false|\\d+)$/.test(contextArray[i])) arr.push(contextArray[i]);\n                    else {\n                        arr.push(getCompileVar(contextArray[i], ctx));\n                    }\n                }\n    \n                return arr.join(', ');\n            }\n            function compile(template, depth) {\n                depth = depth || 1;\n                template = template || t.template;\n                if (typeof template !== 'string') {\n                    throw new Error('Template7: Template must be a string');\n                }\n                var blocks = stringToBlocks(template);\n                if (blocks.length === 0) {\n                    return function () { return ''; };\n                }\n                var ctx = 'ctx_' + depth;\n                var resultString = '';\n                if (depth === 1) {\n                    resultString += '(function (' + ctx + ', data, root) {\\n';\n                }\n                else {\n                    resultString += '(function (' + ctx + ', data) {\\n';\n                }\n                if (depth === 1) {\n                    resultString += 'function isArray(arr){return Object.prototype.toString.apply(arr) === \\'[object Array]\\';}\\n';\n                    resultString += 'function isFunction(func){return (typeof func === \\'function\\');}\\n';\n                    resultString += 'function c(val, ctx) {if (typeof val !== \"undefined\" && val !== null) {if (isFunction(val)) {return val.call(ctx);} else return val;} else return \"\";}\\n';\n                    resultString += 'root = root || ctx_1 || {};\\n';\n                }\n                resultString += 'var r = \\'\\';\\n';\n                var i, j, context;\n                for (i = 0; i < blocks.length; i++) {\n                    var block = blocks[i];\n                    // Plain block\n                    if (block.type === 'plain') {\n                        resultString += 'r +=\\'' + (block.content).replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n').replace(/'/g, '\\\\' + '\\'') + '\\';';\n                        continue;\n                    }\n                    var variable, compiledArguments;\n                    // Variable block\n                    if (block.type === 'variable') {\n                        variable = getCompileVar(block.contextName, ctx);\n                        resultString += 'r += c(' + variable + ', ' + ctx + ');';\n                    }\n                    // Helpers block\n                    if (block.type === 'helper') {\n                        if (block.helperName in t.helpers) {\n                            compiledArguments = getCompiledArguments(block.contextName, ctx);\n    \n                            resultString += 'r += (Template7.helpers.' + block.helperName + ').call(' + ctx + ', ' + (compiledArguments && (compiledArguments + ', ')) +'{hash:' + JSON.stringify(block.hash) + ', data: data || {}, fn: ' + getCompileFn(block, depth + 1) + ', inverse: ' + getCompileInverse(block, depth + 1) + ', root: root});';\n    \n                        }\n                        else {\n                            if (block.contextName.length > 0) {\n                                throw new Error('Template7: Missing helper: \"' + block.helperName + '\"');\n                            }\n                            else {\n                                variable = getCompileVar(block.helperName, ctx);\n                                resultString += 'if (' + variable + ') {';\n                                resultString += 'if (isArray(' + variable + ')) {';\n                                resultString += 'r += (Template7.helpers.each).call(' + ctx + ', ' + variable + ', {hash:' + JSON.stringify(block.hash) + ', data: data || {}, fn: ' + getCompileFn(block, depth+1) + ', inverse: ' + getCompileInverse(block, depth+1) + ', root: root});';\n                                resultString += '}else {';\n                                resultString += 'r += (Template7.helpers.with).call(' + ctx + ', ' + variable + ', {hash:' + JSON.stringify(block.hash) + ', data: data || {}, fn: ' + getCompileFn(block, depth+1) + ', inverse: ' + getCompileInverse(block, depth+1) + ', root: root});';\n                                resultString += '}}';\n                            }\n                        }\n                    }\n                }\n                resultString += '\\nreturn r;})';\n                return eval.call(window, resultString);\n            }\n            t.compile = function (template) {\n                if (!t.compiled) {\n                    t.compiled = compile(template);\n                }\n                return t.compiled;\n            };\n        };\n        Template7.prototype = {\n            options: {},\n            partials: {},\n            helpers: {\n                '_partial' : function (partialName, options) {\n                    var p = Template7.prototype.partials[partialName];\n                    if (!p || (p && !p.template)) return '';\n                    if (!p.compiled) {\n                        p.compiled = new Template7(p.template).compile();\n                    }\n                    var ctx = this;\n                    for (var hashName in options.hash) {\n                        ctx[hashName] = options.hash[hashName];\n                    }\n                    return p.compiled(ctx, options.data, options.root);\n                },\n                'escape': function (context, options) {\n                    if (typeof context !== 'string') {\n                        throw new Error('Template7: Passed context to \"escape\" helper should be a string');\n                    }\n                    return _escape(context);\n                },\n                'if': function (context, options) {\n                    if (isFunction(context)) { context = context.call(this); }\n                    if (context) {\n                        return options.fn(this, options.data);\n                    }\n                    else {\n                        return options.inverse(this, options.data);\n                    }\n                },\n                'unless': function (context, options) {\n                    if (isFunction(context)) { context = context.call(this); }\n                    if (!context) {\n                        return options.fn(this, options.data);\n                    }\n                    else {\n                        return options.inverse(this, options.data);\n                    }\n                },\n                'each': function (context, options) {\n                    var ret = '', i = 0;\n                    if (isFunction(context)) { context = context.call(this); }\n                    if (isArray(context)) {\n                        if (options.hash.reverse) {\n                            context = context.reverse();\n                        }\n                        for (i = 0; i < context.length; i++) {\n                            ret += options.fn(context[i], {first: i === 0, last: i === context.length - 1, index: i});\n                        }\n                        if (options.hash.reverse) {\n                            context = context.reverse();\n                        }\n                    }\n                    else {\n                        for (var key in context) {\n                            i++;\n                            ret += options.fn(context[key], {key: key});\n                        }\n                    }\n                    if (i > 0) return ret;\n                    else return options.inverse(this);\n                },\n                'with': function (context, options) {\n                    if (isFunction(context)) { context = context.call(this); }\n                    return options.fn(context);\n                },\n                'join': function (context, options) {\n                    if (isFunction(context)) { context = context.call(this); }\n                    return context.join(options.hash.delimiter || options.hash.delimeter);\n                },\n                'js': function (expression, options) {\n                    var func;\n                    if (expression.indexOf('return')>=0) {\n                        func = '(function(){'+expression+'})';\n                    }\n                    else {\n                        func = '(function(){return ('+expression+')})';\n                    }\n                    return eval.call(this, func).call(this);\n                },\n                'js_compare': function (expression, options) {\n                    var func;\n                    if (expression.indexOf('return')>=0) {\n                        func = '(function(){'+expression+'})';\n                    }\n                    else {\n                        func = '(function(){return ('+expression+')})';\n                    }\n                    var condition = eval.call(this, func).call(this);\n                    if (condition) {\n                        return options.fn(this, options.data);\n                    }\n                    else {\n                        return options.inverse(this, options.data);\n                    }\n                }\n            }\n        };\n        var t7 = function (template, data) {\n            if (arguments.length === 2) {\n                var instance = new Template7(template);\n                var rendered = instance.compile()(data);\n                instance = null;\n                return (rendered);\n            }\n            else return new Template7(template);\n        };\n        t7.registerHelper = function (name, fn) {\n            Template7.prototype.helpers[name] = fn;\n        };\n        t7.unregisterHelper = function (name) {\n            Template7.prototype.helpers[name] = undefined;\n            delete Template7.prototype.helpers[name];\n        };\n        t7.registerPartial = function (name, template) {\n            Template7.prototype.partials[name] = {template: template};\n        };\n        t7.unregisterPartial = function (name, template) {\n            if (Template7.prototype.partials[name]) {\n                Template7.prototype.partials[name] = undefined;\n                delete Template7.prototype.partials[name];\n            }\n        };\n        t7.compile = function (template, options) {\n            var instance = new Template7(template, options);\n            return instance.compile();\n        };\n    \n        t7.options = Template7.prototype.options;\n        t7.helpers = Template7.prototype.helpers;\n        t7.partials = Template7.prototype.partials;\n        return t7;\n    })();\n\n    /*===========================\n    Swiper\n    ===========================*/\n    window.Swiper = function (container, params) {\n        if (!(this instanceof Swiper)) return new Swiper(container, params);\n        var defaults = {\n            direction: 'horizontal',\n            touchEventsTarget: 'container',\n            initialSlide: 0,\n            speed: 300,\n            // autoplay\n            autoplay: false,\n            autoplayDisableOnInteraction: true,\n            autoplayStopOnLast: false,\n            // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).\n            iOSEdgeSwipeDetection: false,\n            iOSEdgeSwipeThreshold: 20,\n            // Free mode\n            freeMode: false,\n            freeModeMomentum: true,\n            freeModeMomentumRatio: 1,\n            freeModeMomentumBounce: true,\n            freeModeMomentumBounceRatio: 1,\n            freeModeMomentumVelocityRatio: 1,\n            freeModeSticky: false,\n            freeModeMinimumVelocity: 0.02,\n            // Autoheight\n            autoHeight: false,\n            // Set wrapper width\n            setWrapperSize: false,\n            // Virtual Translate\n            virtualTranslate: false,\n            // Effects\n            effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n            coverflow: {\n                rotate: 50,\n                stretch: 0,\n                depth: 100,\n                modifier: 1,\n                slideShadows : true\n            },\n            flip: {\n                slideShadows : true,\n                limitRotation: true\n            },\n            cube: {\n                slideShadows: true,\n                shadow: true,\n                shadowOffset: 20,\n                shadowScale: 0.94\n            },\n            fade: {\n                crossFade: false\n            },\n            // Parallax\n            parallax: false,\n            // Zoom\n            zoom: false,\n            zoomMax: 3,\n            zoomMin: 1,\n            zoomToggle: true,\n            // Scrollbar\n            scrollbar: null,\n            scrollbarHide: true,\n            scrollbarDraggable: false,\n            scrollbarSnapOnRelease: false,\n            // Keyboard Mousewheel\n            keyboardControl: false,\n            mousewheelControl: false,\n            mousewheelReleaseOnEdges: false,\n            mousewheelInvert: false,\n            mousewheelForceToAxis: false,\n            mousewheelSensitivity: 1,\n            mousewheelEventsTarged: 'container',\n            // Hash Navigation\n            hashnav: false,\n            hashnavWatchState: false,\n            // History\n            history: false,\n            // Commong Nav State\n            replaceState: false,\n            // Breakpoints\n            breakpoints: undefined,\n            // Slides grid\n            spaceBetween: 0,\n            slidesPerView: 1,\n            slidesPerColumn: 1,\n            slidesPerColumnFill: 'column',\n            slidesPerGroup: 1,\n            centeredSlides: false,\n            slidesOffsetBefore: 0, // in px\n            slidesOffsetAfter: 0, // in px\n            // Round length\n            roundLengths: false,\n            // Touches\n            touchRatio: 1,\n            touchAngle: 45,\n            simulateTouch: true,\n            shortSwipes: true,\n            longSwipes: true,\n            longSwipesRatio: 0.5,\n            longSwipesMs: 300,\n            followFinger: true,\n            onlyExternal: false,\n            threshold: 0,\n            touchMoveStopPropagation: true,\n            touchReleaseOnEdges: false,\n            // Unique Navigation Elements\n            uniqueNavElements: true,\n            // Pagination\n            pagination: null,\n            paginationElement: 'span',\n            paginationClickable: false,\n            paginationHide: false,\n            paginationBulletRender: null,\n            paginationProgressRender: null,\n            paginationFractionRender: null,\n            paginationCustomRender: null,\n            paginationType: 'bullets', // 'bullets' or 'progress' or 'fraction' or 'custom'\n            // Resistance\n            resistance: true,\n            resistanceRatio: 0.85,\n            // Next/prev buttons\n            nextButton: null,\n            prevButton: null,\n            // Progress\n            watchSlidesProgress: false,\n            watchSlidesVisibility: false,\n            // Cursor\n            grabCursor: false,\n            // Clicks\n            preventClicks: true,\n            preventClicksPropagation: true,\n            slideToClickedSlide: false,\n            // Lazy Loading\n            lazyLoading: false,\n            lazyLoadingInPrevNext: false,\n            lazyLoadingInPrevNextAmount: 1,\n            lazyLoadingOnTransitionStart: false,\n            // Images\n            preloadImages: true,\n            updateOnImagesReady: true,\n            // loop\n            loop: false,\n            loopAdditionalSlides: 0,\n            loopedSlides: null,\n            // Control\n            control: undefined,\n            controlInverse: false,\n            controlBy: 'slide', //or 'container'\n            normalizeSlideIndex: true,\n            // Swiping/no swiping\n            allowSwipeToPrev: true,\n            allowSwipeToNext: true,\n            swipeHandler: null, //'.swipe-handler',\n            noSwiping: true,\n            noSwipingClass: 'swiper-no-swiping',\n            // Passive Listeners\n            passiveListeners: true,\n            // NS\n            containerModifierClass: 'swiper-container-', // NEW\n            slideClass: 'swiper-slide',\n            slideActiveClass: 'swiper-slide-active',\n            slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n            slideVisibleClass: 'swiper-slide-visible',\n            slideDuplicateClass: 'swiper-slide-duplicate',\n            slideNextClass: 'swiper-slide-next',\n            slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n            slidePrevClass: 'swiper-slide-prev',\n            slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n            wrapperClass: 'swiper-wrapper',\n            bulletClass: 'swiper-pagination-bullet',\n            bulletActiveClass: 'swiper-pagination-bullet-active',\n            buttonDisabledClass: 'swiper-button-disabled',\n            paginationCurrentClass: 'swiper-pagination-current',\n            paginationTotalClass: 'swiper-pagination-total',\n            paginationHiddenClass: 'swiper-pagination-hidden',\n            paginationProgressbarClass: 'swiper-pagination-progressbar',\n            paginationClickableClass: 'swiper-pagination-clickable', // NEW\n            paginationModifierClass: 'swiper-pagination-', // NEW\n            lazyLoadingClass: 'swiper-lazy',\n            lazyStatusLoadingClass: 'swiper-lazy-loading',\n            lazyStatusLoadedClass: 'swiper-lazy-loaded',\n            lazyPreloaderClass: 'swiper-lazy-preloader',\n            notificationClass: 'swiper-notification',\n            preloaderClass: 'preloader',\n            zoomContainerClass: 'swiper-zoom-container',\n        \n            // Observer\n            observer: false,\n            observeParents: false,\n            // Accessibility\n            a11y: false,\n            prevSlideMessage: 'Previous slide',\n            nextSlideMessage: 'Next slide',\n            firstSlideMessage: 'This is the first slide',\n            lastSlideMessage: 'This is the last slide',\n            paginationBulletMessage: 'Go to slide {{index}}',\n            // Callbacks\n            runCallbacksOnInit: true\n            /*\n            Callbacks:\n            onInit: function (swiper)\n            onDestroy: function (swiper)\n            onClick: function (swiper, e)\n            onTap: function (swiper, e)\n            onDoubleTap: function (swiper, e)\n            onSliderMove: function (swiper, e)\n            onSlideChangeStart: function (swiper)\n            onSlideChangeEnd: function (swiper)\n            onTransitionStart: function (swiper)\n            onTransitionEnd: function (swiper)\n            onImagesReady: function (swiper)\n            onProgress: function (swiper, progress)\n            onTouchStart: function (swiper, e)\n            onTouchMove: function (swiper, e)\n            onTouchMoveOpposite: function (swiper, e)\n            onTouchEnd: function (swiper, e)\n            onReachBeginning: function (swiper)\n            onReachEnd: function (swiper)\n            onSetTransition: function (swiper, duration)\n            onSetTranslate: function (swiper, translate)\n            onAutoplayStart: function (swiper)\n            onAutoplayStop: function (swiper),\n            onLazyImageLoad: function (swiper, slide, image)\n            onLazyImageReady: function (swiper, slide, image)\n            */\n        \n        };\n        var initialVirtualTranslate = params && params.virtualTranslate;\n        \n        params = params || {};\n        var originalParams = {};\n        for (var param in params) {\n            if (typeof params[param] === 'object' && params[param] !== null && !(params[param].nodeType || params[param] === window || params[param] === document || (typeof Dom7 !== 'undefined' && params[param] instanceof Dom7) || (typeof jQuery !== 'undefined' && params[param] instanceof jQuery))) {\n                originalParams[param] = {};\n                for (var deepParam in params[param]) {\n                    originalParams[param][deepParam] = params[param][deepParam];\n                }\n            }\n            else {\n                originalParams[param] = params[param];\n            }\n        }\n        for (var def in defaults) {\n            if (typeof params[def] === 'undefined') {\n                params[def] = defaults[def];\n            }\n            else if (typeof params[def] === 'object') {\n                for (var deepDef in defaults[def]) {\n                    if (typeof params[def][deepDef] === 'undefined') {\n                        params[def][deepDef] = defaults[def][deepDef];\n                    }\n                }\n            }\n        }\n        \n        // Swiper\n        var s = this;\n        \n        // Params\n        s.params = params;\n        s.originalParams = originalParams;\n        \n        // Classname\n        s.classNames = [];\n        /*=========================\n          Dom Library and plugins\n          ===========================*/\n        if (typeof $ !== 'undefined' && typeof Dom7 !== 'undefined'){\n            $ = Dom7;\n        }\n        if (typeof $ === 'undefined') {\n            if (typeof Dom7 === 'undefined') {\n                $ = window.Dom7 || window.Zepto || window.jQuery;\n            }\n            else {\n                $ = Dom7;\n            }\n            if (!$) return;\n        }\n        // Export it to Swiper instance\n        s.$ = $;\n        \n        /*=========================\n          Breakpoints\n          ===========================*/\n        s.currentBreakpoint = undefined;\n        s.getActiveBreakpoint = function () {\n            //Get breakpoint for window width\n            if (!s.params.breakpoints) return false;\n            var breakpoint = false;\n            var points = [], point;\n            for ( point in s.params.breakpoints ) {\n                if (s.params.breakpoints.hasOwnProperty(point)) {\n                    points.push(point);\n                }\n            }\n            points.sort(function (a, b) {\n                return parseInt(a, 10) > parseInt(b, 10);\n            });\n            for (var i = 0; i < points.length; i++) {\n                point = points[i];\n                if (point >= window.innerWidth && !breakpoint) {\n                    breakpoint = point;\n                }\n            }\n            return breakpoint || 'max';\n        };\n        s.setBreakpoint = function () {\n            //Set breakpoint for window width and update parameters\n            var breakpoint = s.getActiveBreakpoint();\n            if (breakpoint && s.currentBreakpoint !== breakpoint) {\n                var breakPointsParams = breakpoint in s.params.breakpoints ? s.params.breakpoints[breakpoint] : s.originalParams;\n                var needsReLoop = s.params.loop && (breakPointsParams.slidesPerView !== s.params.slidesPerView);\n                for ( var param in breakPointsParams ) {\n                    s.params[param] = breakPointsParams[param];\n                }\n                s.currentBreakpoint = breakpoint;\n                if(needsReLoop && s.destroyLoop) {\n                    s.reLoop(true);\n                }\n            }\n        };\n        // Set breakpoint on load\n        if (s.params.breakpoints) {\n            s.setBreakpoint();\n        }\n        \n        /*=========================\n          Preparation - Define Container, Wrapper and Pagination\n          ===========================*/\n        s.container = $(container);\n        if (s.container.length === 0) return;\n        if (s.container.length > 1) {\n            var swipers = [];\n            s.container.each(function () {\n                var container = this;\n                swipers.push(new Swiper(this, params));\n            });\n            return swipers;\n        }\n        \n        // Save instance in container HTML Element and in data\n        s.container[0].swiper = s;\n        s.container.data('swiper', s);\n        \n        s.classNames.push(s.params.containerModifierClass + s.params.direction);\n        \n        if (s.params.freeMode) {\n            s.classNames.push(s.params.containerModifierClass + 'free-mode');\n        }\n        if (!s.support.flexbox) {\n            s.classNames.push(s.params.containerModifierClass + 'no-flexbox');\n            s.params.slidesPerColumn = 1;\n        }\n        if (s.params.autoHeight) {\n            s.classNames.push(s.params.containerModifierClass + 'autoheight');\n        }\n        // Enable slides progress when required\n        if (s.params.parallax || s.params.watchSlidesVisibility) {\n            s.params.watchSlidesProgress = true;\n        }\n        // Max resistance when touchReleaseOnEdges\n        if (s.params.touchReleaseOnEdges) {\n            s.params.resistanceRatio = 0;\n        }\n        // Coverflow / 3D\n        if (['cube', 'coverflow', 'flip'].indexOf(s.params.effect) >= 0) {\n            if (s.support.transforms3d) {\n                s.params.watchSlidesProgress = true;\n                s.classNames.push(s.params.containerModifierClass + '3d');\n            }\n            else {\n                s.params.effect = 'slide';\n            }\n        }\n        if (s.params.effect !== 'slide') {\n            s.classNames.push(s.params.containerModifierClass + s.params.effect);\n        }\n        if (s.params.effect === 'cube') {\n            s.params.resistanceRatio = 0;\n            s.params.slidesPerView = 1;\n            s.params.slidesPerColumn = 1;\n            s.params.slidesPerGroup = 1;\n            s.params.centeredSlides = false;\n            s.params.spaceBetween = 0;\n            s.params.virtualTranslate = true;\n            s.params.setWrapperSize = false;\n        }\n        if (s.params.effect === 'fade' || s.params.effect === 'flip') {\n            s.params.slidesPerView = 1;\n            s.params.slidesPerColumn = 1;\n            s.params.slidesPerGroup = 1;\n            s.params.watchSlidesProgress = true;\n            s.params.spaceBetween = 0;\n            s.params.setWrapperSize = false;\n            if (typeof initialVirtualTranslate === 'undefined') {\n                s.params.virtualTranslate = true;\n            }\n        }\n        \n        // Grab Cursor\n        if (s.params.grabCursor && s.support.touch) {\n            s.params.grabCursor = false;\n        }\n        \n        // Wrapper\n        s.wrapper = s.container.children('.' + s.params.wrapperClass);\n        \n        // Pagination\n        if (s.params.pagination) {\n            s.paginationContainer = $(s.params.pagination);\n            if (s.params.uniqueNavElements && typeof s.params.pagination === 'string' && s.paginationContainer.length > 1 && s.container.find(s.params.pagination).length === 1) {\n                s.paginationContainer = s.container.find(s.params.pagination);\n            }\n        \n            if (s.params.paginationType === 'bullets' && s.params.paginationClickable) {\n                s.paginationContainer.addClass(s.params.paginationModifierClass + 'clickable');\n            }\n            else {\n                s.params.paginationClickable = false;\n            }\n            s.paginationContainer.addClass(s.params.paginationModifierClass + s.params.paginationType);\n        }\n        // Next/Prev Buttons\n        if (s.params.nextButton || s.params.prevButton) {\n            if (s.params.nextButton) {\n                s.nextButton = $(s.params.nextButton);\n                if (s.params.uniqueNavElements && typeof s.params.nextButton === 'string' && s.nextButton.length > 1 && s.container.find(s.params.nextButton).length === 1) {\n                    s.nextButton = s.container.find(s.params.nextButton);\n                }\n            }\n            if (s.params.prevButton) {\n                s.prevButton = $(s.params.prevButton);\n                if (s.params.uniqueNavElements && typeof s.params.prevButton === 'string' && s.prevButton.length > 1 && s.container.find(s.params.prevButton).length === 1) {\n                    s.prevButton = s.container.find(s.params.prevButton);\n                }\n            }\n        }\n        \n        // Is Horizontal\n        s.isHorizontal = function () {\n            return s.params.direction === 'horizontal';\n        };\n        // s.isH = isH;\n        \n        // RTL\n        s.rtl = s.isHorizontal() && (s.container[0].dir.toLowerCase() === 'rtl' || s.container.css('direction') === 'rtl');\n        if (s.rtl) {\n            s.classNames.push(s.params.containerModifierClass + 'rtl');\n        }\n        \n        // Wrong RTL support\n        if (s.rtl) {\n            s.wrongRTL = s.wrapper.css('display') === '-webkit-box';\n        }\n        \n        // Columns\n        if (s.params.slidesPerColumn > 1) {\n            s.classNames.push(s.params.containerModifierClass + 'multirow');\n        }\n        \n        // Check for Android\n        if (s.device.android) {\n            s.classNames.push(s.params.containerModifierClass + 'android');\n        }\n        \n        // Add classes\n        s.container.addClass(s.classNames.join(' '));\n        \n        // Translate\n        s.translate = 0;\n        \n        // Progress\n        s.progress = 0;\n        \n        // Velocity\n        s.velocity = 0;\n        \n        /*=========================\n          Locks, unlocks\n          ===========================*/\n        s.lockSwipeToNext = function () {\n            s.params.allowSwipeToNext = false;\n            if (s.params.allowSwipeToPrev === false && s.params.grabCursor) {\n                s.unsetGrabCursor();\n            }\n        };\n        s.lockSwipeToPrev = function () {\n            s.params.allowSwipeToPrev = false;\n            if (s.params.allowSwipeToNext === false && s.params.grabCursor) {\n                s.unsetGrabCursor();\n            }\n        };\n        s.lockSwipes = function () {\n            s.params.allowSwipeToNext = s.params.allowSwipeToPrev = false;\n            if (s.params.grabCursor) s.unsetGrabCursor();\n        };\n        s.unlockSwipeToNext = function () {\n            s.params.allowSwipeToNext = true;\n            if (s.params.allowSwipeToPrev === true && s.params.grabCursor) {\n                s.setGrabCursor();\n            }\n        };\n        s.unlockSwipeToPrev = function () {\n            s.params.allowSwipeToPrev = true;\n            if (s.params.allowSwipeToNext === true && s.params.grabCursor) {\n                s.setGrabCursor();\n            }\n        };\n        s.unlockSwipes = function () {\n            s.params.allowSwipeToNext = s.params.allowSwipeToPrev = true;\n            if (s.params.grabCursor) s.setGrabCursor();\n        };\n        \n        /*=========================\n          Round helper\n          ===========================*/\n        function round(a) {\n            return Math.floor(a);\n        }\n        /*=========================\n          Set grab cursor\n          ===========================*/\n        s.setGrabCursor = function(moving) {\n            s.container[0].style.cursor = 'move';\n            s.container[0].style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n            s.container[0].style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n            s.container[0].style.cursor = moving ? 'grabbing': 'grab';\n        };\n        s.unsetGrabCursor = function () {\n            s.container[0].style.cursor = '';\n        };\n        if (s.params.grabCursor) {\n            s.setGrabCursor();\n        }\n        /*=========================\n          Update on Images Ready\n          ===========================*/\n        s.imagesToLoad = [];\n        s.imagesLoaded = 0;\n        \n        s.loadImage = function (imgElement, src, srcset, sizes, checkForComplete, callback) {\n            var image;\n            function onReady () {\n                if (callback) callback();\n            }\n            if (!imgElement.complete || !checkForComplete) {\n                if (src) {\n                    image = new window.Image();\n                    image.onload = onReady;\n                    image.onerror = onReady;\n                    if (sizes) {\n                        image.sizes = sizes;\n                    }\n                    if (srcset) {\n                        image.srcset = srcset;\n                    }\n                    if (src) {\n                        image.src = src;\n                    }\n                } else {\n                    onReady();\n                }\n        \n            } else {//image already loaded...\n                onReady();\n            }\n        };\n        s.preloadImages = function () {\n            s.imagesToLoad = s.container.find('img');\n            function _onReady() {\n                if (typeof s === 'undefined' || s === null) return;\n                if (s.imagesLoaded !== undefined) s.imagesLoaded++;\n                if (s.imagesLoaded === s.imagesToLoad.length) {\n                    if (s.params.updateOnImagesReady) s.update();\n                    s.emit('onImagesReady', s);\n                }\n            }\n            for (var i = 0; i < s.imagesToLoad.length; i++) {\n                s.loadImage(s.imagesToLoad[i], (s.imagesToLoad[i].currentSrc || s.imagesToLoad[i].getAttribute('src')), (s.imagesToLoad[i].srcset || s.imagesToLoad[i].getAttribute('srcset')), s.imagesToLoad[i].sizes || s.imagesToLoad[i].getAttribute('sizes'), true, _onReady);\n            }\n        };\n        \n        /*=========================\n          Autoplay\n          ===========================*/\n        s.autoplayTimeoutId = undefined;\n        s.autoplaying = false;\n        s.autoplayPaused = false;\n        function autoplay() {\n            var autoplayDelay = s.params.autoplay;\n            var activeSlide = s.slides.eq(s.activeIndex);\n            if (activeSlide.attr('data-swiper-autoplay')) {\n                autoplayDelay = activeSlide.attr('data-swiper-autoplay') || s.params.autoplay;\n            }\n            s.autoplayTimeoutId = setTimeout(function () {\n                if (s.params.loop) {\n                    s.fixLoop();\n                    s._slideNext();\n                    s.emit('onAutoplay', s);\n                }\n                else {\n                    if (!s.isEnd) {\n                        s._slideNext();\n                        s.emit('onAutoplay', s);\n                    }\n                    else {\n                        if (!params.autoplayStopOnLast) {\n                            s._slideTo(0);\n                            s.emit('onAutoplay', s);\n                        }\n                        else {\n                            s.stopAutoplay();\n                        }\n                    }\n                }\n            }, autoplayDelay);\n        }\n        s.startAutoplay = function () {\n            if (typeof s.autoplayTimeoutId !== 'undefined') return false;\n            if (!s.params.autoplay) return false;\n            if (s.autoplaying) return false;\n            s.autoplaying = true;\n            s.emit('onAutoplayStart', s);\n            autoplay();\n        };\n        s.stopAutoplay = function (internal) {\n            if (!s.autoplayTimeoutId) return;\n            if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId);\n            s.autoplaying = false;\n            s.autoplayTimeoutId = undefined;\n            s.emit('onAutoplayStop', s);\n        };\n        s.pauseAutoplay = function (speed) {\n            if (s.autoplayPaused) return;\n            if (s.autoplayTimeoutId) clearTimeout(s.autoplayTimeoutId);\n            s.autoplayPaused = true;\n            if (speed === 0) {\n                s.autoplayPaused = false;\n                autoplay();\n            }\n            else {\n                s.wrapper.transitionEnd(function () {\n                    if (!s) return;\n                    s.autoplayPaused = false;\n                    if (!s.autoplaying) {\n                        s.stopAutoplay();\n                    }\n                    else {\n                        autoplay();\n                    }\n                });\n            }\n        };\n        /*=========================\n          Min/Max Translate\n          ===========================*/\n        s.minTranslate = function () {\n            return (-s.snapGrid[0]);\n        };\n        s.maxTranslate = function () {\n            return (-s.snapGrid[s.snapGrid.length - 1]);\n        };\n        /*=========================\n          Slider/slides sizes\n          ===========================*/\n        s.updateAutoHeight = function () {\n            var activeSlides = [];\n            var newHeight = 0;\n        \n            // Find slides currently in view\n            if(s.params.slidesPerView !== 'auto' && s.params.slidesPerView > 1) {\n                for (i = 0; i < Math.ceil(s.params.slidesPerView); i++) {\n                    var index = s.activeIndex + i;\n                    if(index > s.slides.length) break;\n                    activeSlides.push(s.slides.eq(index)[0]);\n                }\n            } else {\n                activeSlides.push(s.slides.eq(s.activeIndex)[0]);\n            }\n        \n            // Find new height from heighest slide in view\n            for (i = 0; i < activeSlides.length; i++) {\n                if (typeof activeSlides[i] !== 'undefined') {\n                    var height = activeSlides[i].offsetHeight;\n                    newHeight = height > newHeight ? height : newHeight;\n                }\n            }\n        \n            // Update Height\n            if (newHeight) s.wrapper.css('height', newHeight + 'px');\n        };\n        s.updateContainerSize = function () {\n            var width, height;\n            if (typeof s.params.width !== 'undefined') {\n                width = s.params.width;\n            }\n            else {\n                width = s.container[0].clientWidth;\n            }\n            if (typeof s.params.height !== 'undefined') {\n                height = s.params.height;\n            }\n            else {\n                height = s.container[0].clientHeight;\n            }\n            if (width === 0 && s.isHorizontal() || height === 0 && !s.isHorizontal()) {\n                return;\n            }\n        \n            //Subtract paddings\n            width = width - parseInt(s.container.css('padding-left'), 10) - parseInt(s.container.css('padding-right'), 10);\n            height = height - parseInt(s.container.css('padding-top'), 10) - parseInt(s.container.css('padding-bottom'), 10);\n        \n            // Store values\n            s.width = width;\n            s.height = height;\n            s.size = s.isHorizontal() ? s.width : s.height;\n        };\n        \n        s.updateSlidesSize = function () {\n            s.slides = s.wrapper.children('.' + s.params.slideClass);\n            s.snapGrid = [];\n            s.slidesGrid = [];\n            s.slidesSizesGrid = [];\n        \n            var spaceBetween = s.params.spaceBetween,\n                slidePosition = -s.params.slidesOffsetBefore,\n                i,\n                prevSlideSize = 0,\n                index = 0;\n            if (typeof s.size === 'undefined') return;\n            if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n                spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * s.size;\n            }\n        \n            s.virtualSize = -spaceBetween;\n            // reset margins\n            if (s.rtl) s.slides.css({marginLeft: '', marginTop: ''});\n            else s.slides.css({marginRight: '', marginBottom: ''});\n        \n            var slidesNumberEvenToRows;\n            if (s.params.slidesPerColumn > 1) {\n                if (Math.floor(s.slides.length / s.params.slidesPerColumn) === s.slides.length / s.params.slidesPerColumn) {\n                    slidesNumberEvenToRows = s.slides.length;\n                }\n                else {\n                    slidesNumberEvenToRows = Math.ceil(s.slides.length / s.params.slidesPerColumn) * s.params.slidesPerColumn;\n                }\n                if (s.params.slidesPerView !== 'auto' && s.params.slidesPerColumnFill === 'row') {\n                    slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, s.params.slidesPerView * s.params.slidesPerColumn);\n                }\n            }\n        \n            // Calc slides\n            var slideSize;\n            var slidesPerColumn = s.params.slidesPerColumn;\n            var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;\n            var numFullColumns = slidesPerRow - (s.params.slidesPerColumn * slidesPerRow - s.slides.length);\n            for (i = 0; i < s.slides.length; i++) {\n                slideSize = 0;\n                var slide = s.slides.eq(i);\n                if (s.params.slidesPerColumn > 1) {\n                    // Set slides order\n                    var newSlideOrderIndex;\n                    var column, row;\n                    if (s.params.slidesPerColumnFill === 'column') {\n                        column = Math.floor(i / slidesPerColumn);\n                        row = i - column * slidesPerColumn;\n                        if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn-1)) {\n                            if (++row >= slidesPerColumn) {\n                                row = 0;\n                                column++;\n                            }\n                        }\n                        newSlideOrderIndex = column + row * slidesNumberEvenToRows / slidesPerColumn;\n                        slide\n                            .css({\n                                '-webkit-box-ordinal-group': newSlideOrderIndex,\n                                '-moz-box-ordinal-group': newSlideOrderIndex,\n                                '-ms-flex-order': newSlideOrderIndex,\n                                '-webkit-order': newSlideOrderIndex,\n                                'order': newSlideOrderIndex\n                            });\n                    }\n                    else {\n                        row = Math.floor(i / slidesPerRow);\n                        column = i - row * slidesPerRow;\n                    }\n                    slide\n                        .css(\n                            'margin-' + (s.isHorizontal() ? 'top' : 'left'),\n                            (row !== 0 && s.params.spaceBetween) && (s.params.spaceBetween + 'px')\n                        )\n                        .attr('data-swiper-column', column)\n                        .attr('data-swiper-row', row);\n        \n                }\n                if (slide.css('display') === 'none') continue;\n                if (s.params.slidesPerView === 'auto') {\n                    slideSize = s.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n                    if (s.params.roundLengths) slideSize = round(slideSize);\n                }\n                else {\n                    slideSize = (s.size - (s.params.slidesPerView - 1) * spaceBetween) / s.params.slidesPerView;\n                    if (s.params.roundLengths) slideSize = round(slideSize);\n        \n                    if (s.isHorizontal()) {\n                        s.slides[i].style.width = slideSize + 'px';\n                    }\n                    else {\n                        s.slides[i].style.height = slideSize + 'px';\n                    }\n                }\n                s.slides[i].swiperSlideSize = slideSize;\n                s.slidesSizesGrid.push(slideSize);\n        \n        \n                if (s.params.centeredSlides) {\n                    slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n                    if (i === 0) slidePosition = slidePosition - s.size / 2 - spaceBetween;\n                    if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n                    if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition);\n                    s.slidesGrid.push(slidePosition);\n                }\n                else {\n                    if ((index) % s.params.slidesPerGroup === 0) s.snapGrid.push(slidePosition);\n                    s.slidesGrid.push(slidePosition);\n                    slidePosition = slidePosition + slideSize + spaceBetween;\n                }\n        \n                s.virtualSize += slideSize + spaceBetween;\n        \n                prevSlideSize = slideSize;\n        \n                index ++;\n            }\n            s.virtualSize = Math.max(s.virtualSize, s.size) + s.params.slidesOffsetAfter;\n            var newSlidesGrid;\n        \n            if (\n                s.rtl && s.wrongRTL && (s.params.effect === 'slide' || s.params.effect === 'coverflow')) {\n                s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'});\n            }\n            if (!s.support.flexbox || s.params.setWrapperSize) {\n                if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'});\n                else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'});\n            }\n        \n            if (s.params.slidesPerColumn > 1) {\n                s.virtualSize = (slideSize + s.params.spaceBetween) * slidesNumberEvenToRows;\n                s.virtualSize = Math.ceil(s.virtualSize / s.params.slidesPerColumn) - s.params.spaceBetween;\n                if (s.isHorizontal()) s.wrapper.css({width: s.virtualSize + s.params.spaceBetween + 'px'});\n                else s.wrapper.css({height: s.virtualSize + s.params.spaceBetween + 'px'});\n                if (s.params.centeredSlides) {\n                    newSlidesGrid = [];\n                    for (i = 0; i < s.snapGrid.length; i++) {\n                        if (s.snapGrid[i] < s.virtualSize + s.snapGrid[0]) newSlidesGrid.push(s.snapGrid[i]);\n                    }\n                    s.snapGrid = newSlidesGrid;\n                }\n            }\n        \n            // Remove last grid elements depending on width\n            if (!s.params.centeredSlides) {\n                newSlidesGrid = [];\n                for (i = 0; i < s.snapGrid.length; i++) {\n                    if (s.snapGrid[i] <= s.virtualSize - s.size) {\n                        newSlidesGrid.push(s.snapGrid[i]);\n                    }\n                }\n                s.snapGrid = newSlidesGrid;\n                if (Math.floor(s.virtualSize - s.size) - Math.floor(s.snapGrid[s.snapGrid.length - 1]) > 1) {\n                    s.snapGrid.push(s.virtualSize - s.size);\n                }\n            }\n            if (s.snapGrid.length === 0) s.snapGrid = [0];\n        \n            if (s.params.spaceBetween !== 0) {\n                if (s.isHorizontal()) {\n                    if (s.rtl) s.slides.css({marginLeft: spaceBetween + 'px'});\n                    else s.slides.css({marginRight: spaceBetween + 'px'});\n                }\n                else s.slides.css({marginBottom: spaceBetween + 'px'});\n            }\n            if (s.params.watchSlidesProgress) {\n                s.updateSlidesOffset();\n            }\n        };\n        s.updateSlidesOffset = function () {\n            for (var i = 0; i < s.slides.length; i++) {\n                s.slides[i].swiperSlideOffset = s.isHorizontal() ? s.slides[i].offsetLeft : s.slides[i].offsetTop;\n            }\n        };\n        \n        /*=========================\n          Slider/slides progress\n          ===========================*/\n        s.updateSlidesProgress = function (translate) {\n            if (typeof translate === 'undefined') {\n                translate = s.translate || 0;\n            }\n            if (s.slides.length === 0) return;\n            if (typeof s.slides[0].swiperSlideOffset === 'undefined') s.updateSlidesOffset();\n        \n            var offsetCenter = -translate;\n            if (s.rtl) offsetCenter = translate;\n        \n            // Visible Slides\n            s.slides.removeClass(s.params.slideVisibleClass);\n            for (var i = 0; i < s.slides.length; i++) {\n                var slide = s.slides[i];\n                var slideProgress = (offsetCenter + (s.params.centeredSlides ? s.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + s.params.spaceBetween);\n                if (s.params.watchSlidesVisibility) {\n                    var slideBefore = -(offsetCenter - slide.swiperSlideOffset);\n                    var slideAfter = slideBefore + s.slidesSizesGrid[i];\n                    var isVisible =\n                        (slideBefore >= 0 && slideBefore < s.size) ||\n                        (slideAfter > 0 && slideAfter <= s.size) ||\n                        (slideBefore <= 0 && slideAfter >= s.size);\n                    if (isVisible) {\n                        s.slides.eq(i).addClass(s.params.slideVisibleClass);\n                    }\n                }\n                slide.progress = s.rtl ? -slideProgress : slideProgress;\n            }\n        };\n        s.updateProgress = function (translate) {\n            if (typeof translate === 'undefined') {\n                translate = s.translate || 0;\n            }\n            var translatesDiff = s.maxTranslate() - s.minTranslate();\n            var wasBeginning = s.isBeginning;\n            var wasEnd = s.isEnd;\n            if (translatesDiff === 0) {\n                s.progress = 0;\n                s.isBeginning = s.isEnd = true;\n            }\n            else {\n                s.progress = (translate - s.minTranslate()) / (translatesDiff);\n                s.isBeginning = s.progress <= 0;\n                s.isEnd = s.progress >= 1;\n            }\n            if (s.isBeginning && !wasBeginning) s.emit('onReachBeginning', s);\n            if (s.isEnd && !wasEnd) s.emit('onReachEnd', s);\n        \n            if (s.params.watchSlidesProgress) s.updateSlidesProgress(translate);\n            s.emit('onProgress', s, s.progress);\n        };\n        s.updateActiveIndex = function () {\n            var translate = s.rtl ? s.translate : -s.translate;\n            var newActiveIndex, i, snapIndex;\n            for (i = 0; i < s.slidesGrid.length; i ++) {\n                if (typeof s.slidesGrid[i + 1] !== 'undefined') {\n                    if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1] - (s.slidesGrid[i + 1] - s.slidesGrid[i]) / 2) {\n                        newActiveIndex = i;\n                    }\n                    else if (translate >= s.slidesGrid[i] && translate < s.slidesGrid[i + 1]) {\n                        newActiveIndex = i + 1;\n                    }\n                }\n                else {\n                    if (translate >= s.slidesGrid[i]) {\n                        newActiveIndex = i;\n                    }\n                }\n            }\n            // Normalize slideIndex\n            if(s.params.normalizeSlideIndex){\n                if (newActiveIndex < 0 || typeof newActiveIndex === 'undefined') newActiveIndex = 0;\n            }\n            // for (i = 0; i < s.slidesGrid.length; i++) {\n                // if (- translate >= s.slidesGrid[i]) {\n                    // newActiveIndex = i;\n                // }\n            // }\n            snapIndex = Math.floor(newActiveIndex / s.params.slidesPerGroup);\n            if (snapIndex >= s.snapGrid.length) snapIndex = s.snapGrid.length - 1;\n        \n            if (newActiveIndex === s.activeIndex) {\n                return;\n            }\n            s.snapIndex = snapIndex;\n            s.previousIndex = s.activeIndex;\n            s.activeIndex = newActiveIndex;\n            s.updateClasses();\n            s.updateRealIndex();\n        };\n        s.updateRealIndex = function(){\n            s.realIndex = s.slides.eq(s.activeIndex).attr('data-swiper-slide-index') || s.activeIndex;\n        };\n        \n        /*=========================\n          Classes\n          ===========================*/\n        s.updateClasses = function () {\n            s.slides.removeClass(s.params.slideActiveClass + ' ' + s.params.slideNextClass + ' ' + s.params.slidePrevClass + ' ' + s.params.slideDuplicateActiveClass + ' ' + s.params.slideDuplicateNextClass + ' ' + s.params.slideDuplicatePrevClass);\n            var activeSlide = s.slides.eq(s.activeIndex);\n            // Active classes\n            activeSlide.addClass(s.params.slideActiveClass);\n            if (params.loop) {\n                // Duplicate to all looped slides\n                if (activeSlide.hasClass(s.params.slideDuplicateClass)) {\n                    s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index=\"' + s.realIndex + '\"]').addClass(s.params.slideDuplicateActiveClass);\n                }\n                else {\n                    s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index=\"' + s.realIndex + '\"]').addClass(s.params.slideDuplicateActiveClass);\n                }\n            }\n            // Next Slide\n            var nextSlide = activeSlide.next('.' + s.params.slideClass).addClass(s.params.slideNextClass);\n            if (s.params.loop && nextSlide.length === 0) {\n                nextSlide = s.slides.eq(0);\n                nextSlide.addClass(s.params.slideNextClass);\n            }\n            // Prev Slide\n            var prevSlide = activeSlide.prev('.' + s.params.slideClass).addClass(s.params.slidePrevClass);\n            if (s.params.loop && prevSlide.length === 0) {\n                prevSlide = s.slides.eq(-1);\n                prevSlide.addClass(s.params.slidePrevClass);\n            }\n            if (params.loop) {\n                // Duplicate to all looped slides\n                if (nextSlide.hasClass(s.params.slideDuplicateClass)) {\n                    s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index=\"' + nextSlide.attr('data-swiper-slide-index') + '\"]').addClass(s.params.slideDuplicateNextClass);\n                }\n                else {\n                    s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index=\"' + nextSlide.attr('data-swiper-slide-index') + '\"]').addClass(s.params.slideDuplicateNextClass);\n                }\n                if (prevSlide.hasClass(s.params.slideDuplicateClass)) {\n                    s.wrapper.children('.' + s.params.slideClass + ':not(.' + s.params.slideDuplicateClass + ')[data-swiper-slide-index=\"' + prevSlide.attr('data-swiper-slide-index') + '\"]').addClass(s.params.slideDuplicatePrevClass);\n                }\n                else {\n                    s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass + '[data-swiper-slide-index=\"' + prevSlide.attr('data-swiper-slide-index') + '\"]').addClass(s.params.slideDuplicatePrevClass);\n                }\n            }\n        \n            // Pagination\n            if (s.paginationContainer && s.paginationContainer.length > 0) {\n                // Current/Total\n                var current,\n                    total = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length;\n                if (s.params.loop) {\n                    current = Math.ceil((s.activeIndex - s.loopedSlides)/s.params.slidesPerGroup);\n                    if (current > s.slides.length - 1 - s.loopedSlides * 2) {\n                        current = current - (s.slides.length - s.loopedSlides * 2);\n                    }\n                    if (current > total - 1) current = current - total;\n                    if (current < 0 && s.params.paginationType !== 'bullets') current = total + current;\n                }\n                else {\n                    if (typeof s.snapIndex !== 'undefined') {\n                        current = s.snapIndex;\n                    }\n                    else {\n                        current = s.activeIndex || 0;\n                    }\n                }\n                // Types\n                if (s.params.paginationType === 'bullets' && s.bullets && s.bullets.length > 0) {\n                    s.bullets.removeClass(s.params.bulletActiveClass);\n                    if (s.paginationContainer.length > 1) {\n                        s.bullets.each(function () {\n                            if ($(this).index() === current) $(this).addClass(s.params.bulletActiveClass);\n                        });\n                    }\n                    else {\n                        s.bullets.eq(current).addClass(s.params.bulletActiveClass);\n                    }\n                }\n                if (s.params.paginationType === 'fraction') {\n                    s.paginationContainer.find('.' + s.params.paginationCurrentClass).text(current + 1);\n                    s.paginationContainer.find('.' + s.params.paginationTotalClass).text(total);\n                }\n                if (s.params.paginationType === 'progress') {\n                    var scale = (current + 1) / total,\n                        scaleX = scale,\n                        scaleY = 1;\n                    if (!s.isHorizontal()) {\n                        scaleY = scale;\n                        scaleX = 1;\n                    }\n                    s.paginationContainer.find('.' + s.params.paginationProgressbarClass).transform('translate3d(0,0,0) scaleX(' + scaleX + ') scaleY(' + scaleY + ')').transition(s.params.speed);\n                }\n                if (s.params.paginationType === 'custom' && s.params.paginationCustomRender) {\n                    s.paginationContainer.html(s.params.paginationCustomRender(s, current + 1, total));\n                    s.emit('onPaginationRendered', s, s.paginationContainer[0]);\n                }\n            }\n        \n            // Next/active buttons\n            if (!s.params.loop) {\n                if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) {\n                    if (s.isBeginning) {\n                        s.prevButton.addClass(s.params.buttonDisabledClass);\n                        if (s.params.a11y && s.a11y) s.a11y.disable(s.prevButton);\n                    }\n                    else {\n                        s.prevButton.removeClass(s.params.buttonDisabledClass);\n                        if (s.params.a11y && s.a11y) s.a11y.enable(s.prevButton);\n                    }\n                }\n                if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) {\n                    if (s.isEnd) {\n                        s.nextButton.addClass(s.params.buttonDisabledClass);\n                        if (s.params.a11y && s.a11y) s.a11y.disable(s.nextButton);\n                    }\n                    else {\n                        s.nextButton.removeClass(s.params.buttonDisabledClass);\n                        if (s.params.a11y && s.a11y) s.a11y.enable(s.nextButton);\n                    }\n                }\n            }\n        };\n        \n        /*=========================\n          Pagination\n          ===========================*/\n        s.updatePagination = function () {\n            if (!s.params.pagination) return;\n            if (s.paginationContainer && s.paginationContainer.length > 0) {\n                var paginationHTML = '';\n                if (s.params.paginationType === 'bullets') {\n                    var numberOfBullets = s.params.loop ? Math.ceil((s.slides.length - s.loopedSlides * 2) / s.params.slidesPerGroup) : s.snapGrid.length;\n                    for (var i = 0; i < numberOfBullets; i++) {\n                        if (s.params.paginationBulletRender) {\n                            paginationHTML += s.params.paginationBulletRender(s, i, s.params.bulletClass);\n                        }\n                        else {\n                            paginationHTML += '<' + s.params.paginationElement+' class=\"' + s.params.bulletClass + '\"></' + s.params.paginationElement + '>';\n                        }\n                    }\n                    s.paginationContainer.html(paginationHTML);\n                    s.bullets = s.paginationContainer.find('.' + s.params.bulletClass);\n                    if (s.params.paginationClickable && s.params.a11y && s.a11y) {\n                        s.a11y.initPagination();\n                    }\n                }\n                if (s.params.paginationType === 'fraction') {\n                    if (s.params.paginationFractionRender) {\n                        paginationHTML = s.params.paginationFractionRender(s, s.params.paginationCurrentClass, s.params.paginationTotalClass);\n                    }\n                    else {\n                        paginationHTML =\n                            '<span class=\"' + s.params.paginationCurrentClass + '\"></span>' +\n                            ' / ' +\n                            '<span class=\"' + s.params.paginationTotalClass+'\"></span>';\n                    }\n                    s.paginationContainer.html(paginationHTML);\n                }\n                if (s.params.paginationType === 'progress') {\n                    if (s.params.paginationProgressRender) {\n                        paginationHTML = s.params.paginationProgressRender(s, s.params.paginationProgressbarClass);\n                    }\n                    else {\n                        paginationHTML = '<span class=\"' + s.params.paginationProgressbarClass + '\"></span>';\n                    }\n                    s.paginationContainer.html(paginationHTML);\n                }\n                if (s.params.paginationType !== 'custom') {\n                    s.emit('onPaginationRendered', s, s.paginationContainer[0]);\n                }\n            }\n        };\n        /*=========================\n          Common update method\n          ===========================*/\n        s.update = function (updateTranslate) {\n            s.updateContainerSize();\n            s.updateSlidesSize();\n            s.updateProgress();\n            s.updatePagination();\n            s.updateClasses();\n            if (s.params.scrollbar && s.scrollbar) {\n                s.scrollbar.set();\n            }\n            function forceSetTranslate() {\n                var translate = s.rtl ? -s.translate : s.translate;\n                newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate());\n                s.setWrapperTranslate(newTranslate);\n                s.updateActiveIndex();\n                s.updateClasses();\n            }\n            if (updateTranslate) {\n                var translated, newTranslate;\n                if (s.controller && s.controller.spline) {\n                    s.controller.spline = undefined;\n                }\n                if (s.params.freeMode) {\n                    forceSetTranslate();\n                    if (s.params.autoHeight) {\n                        s.updateAutoHeight();\n                    }\n                }\n                else {\n                    if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) {\n                        translated = s.slideTo(s.slides.length - 1, 0, false, true);\n                    }\n                    else {\n                        translated = s.slideTo(s.activeIndex, 0, false, true);\n                    }\n                    if (!translated) {\n                        forceSetTranslate();\n                    }\n                }\n            }\n            else if (s.params.autoHeight) {\n                s.updateAutoHeight();\n            }\n        };\n        \n        /*=========================\n          Resize Handler\n          ===========================*/\n        s.onResize = function (forceUpdatePagination) {\n            //Breakpoints\n            if (s.params.breakpoints) {\n                s.setBreakpoint();\n            }\n        \n            // Disable locks on resize\n            var allowSwipeToPrev = s.params.allowSwipeToPrev;\n            var allowSwipeToNext = s.params.allowSwipeToNext;\n            s.params.allowSwipeToPrev = s.params.allowSwipeToNext = true;\n        \n            s.updateContainerSize();\n            s.updateSlidesSize();\n            if (s.params.slidesPerView === 'auto' || s.params.freeMode || forceUpdatePagination) s.updatePagination();\n            if (s.params.scrollbar && s.scrollbar) {\n                s.scrollbar.set();\n            }\n            if (s.controller && s.controller.spline) {\n                s.controller.spline = undefined;\n            }\n            var slideChangedBySlideTo = false;\n            if (s.params.freeMode) {\n                var newTranslate = Math.min(Math.max(s.translate, s.maxTranslate()), s.minTranslate());\n                s.setWrapperTranslate(newTranslate);\n                s.updateActiveIndex();\n                s.updateClasses();\n        \n                if (s.params.autoHeight) {\n                    s.updateAutoHeight();\n                }\n            }\n            else {\n                s.updateClasses();\n                if ((s.params.slidesPerView === 'auto' || s.params.slidesPerView > 1) && s.isEnd && !s.params.centeredSlides) {\n                    slideChangedBySlideTo = s.slideTo(s.slides.length - 1, 0, false, true);\n                }\n                else {\n                    slideChangedBySlideTo = s.slideTo(s.activeIndex, 0, false, true);\n                }\n            }\n            if (s.params.lazyLoading && !slideChangedBySlideTo && s.lazy) {\n                s.lazy.load();\n            }\n            // Return locks after resize\n            s.params.allowSwipeToPrev = allowSwipeToPrev;\n            s.params.allowSwipeToNext = allowSwipeToNext;\n        };\n        \n        /*=========================\n          Events\n          ===========================*/\n        \n        //Define Touch Events\n        s.touchEventsDesktop = {start: 'mousedown', move: 'mousemove', end: 'mouseup'};\n        if (window.navigator.pointerEnabled) s.touchEventsDesktop = {start: 'pointerdown', move: 'pointermove', end: 'pointerup'};\n        else if (window.navigator.msPointerEnabled) s.touchEventsDesktop = {start: 'MSPointerDown', move: 'MSPointerMove', end: 'MSPointerUp'};\n        s.touchEvents = {\n            start : s.support.touch || !s.params.simulateTouch  ? 'touchstart' : s.touchEventsDesktop.start,\n            move : s.support.touch || !s.params.simulateTouch ? 'touchmove' : s.touchEventsDesktop.move,\n            end : s.support.touch || !s.params.simulateTouch ? 'touchend' : s.touchEventsDesktop.end\n        };\n        \n        \n        // WP8 Touch Events Fix\n        if (window.navigator.pointerEnabled || window.navigator.msPointerEnabled) {\n            (s.params.touchEventsTarget === 'container' ? s.container : s.wrapper).addClass('swiper-wp8-' + s.params.direction);\n        }\n        \n        // Attach/detach events\n        s.initEvents = function (detach) {\n            var actionDom = detach ? 'off' : 'on';\n            var action = detach ? 'removeEventListener' : 'addEventListener';\n            var touchEventsTarget = s.params.touchEventsTarget === 'container' ? s.container[0] : s.wrapper[0];\n            var target = s.support.touch ? touchEventsTarget : document;\n        \n            var moveCapture = s.params.nested ? true : false;\n        \n            //Touch Events\n            if (s.browser.ie) {\n                touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, false);\n                target[action](s.touchEvents.move, s.onTouchMove, moveCapture);\n                target[action](s.touchEvents.end, s.onTouchEnd, false);\n            }\n            else {\n                if (s.support.touch) {\n                    var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false;\n                    touchEventsTarget[action](s.touchEvents.start, s.onTouchStart, passiveListener);\n                    touchEventsTarget[action](s.touchEvents.move, s.onTouchMove, moveCapture);\n                    touchEventsTarget[action](s.touchEvents.end, s.onTouchEnd, passiveListener);\n                }\n                if ((params.simulateTouch && !s.device.ios && !s.device.android) || (params.simulateTouch && !s.support.touch && s.device.ios)) {\n                    touchEventsTarget[action]('mousedown', s.onTouchStart, false);\n                    document[action]('mousemove', s.onTouchMove, moveCapture);\n                    document[action]('mouseup', s.onTouchEnd, false);\n                }\n            }\n            window[action]('resize', s.onResize);\n        \n            // Next, Prev, Index\n            if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) {\n                s.nextButton[actionDom]('click', s.onClickNext);\n                if (s.params.a11y && s.a11y) s.nextButton[actionDom]('keydown', s.a11y.onEnterKey);\n            }\n            if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) {\n                s.prevButton[actionDom]('click', s.onClickPrev);\n                if (s.params.a11y && s.a11y) s.prevButton[actionDom]('keydown', s.a11y.onEnterKey);\n            }\n            if (s.params.pagination && s.params.paginationClickable) {\n                s.paginationContainer[actionDom]('click', '.' + s.params.bulletClass, s.onClickIndex);\n                if (s.params.a11y && s.a11y) s.paginationContainer[actionDom]('keydown', '.' + s.params.bulletClass, s.a11y.onEnterKey);\n            }\n        \n            // Prevent Links Clicks\n            if (s.params.preventClicks || s.params.preventClicksPropagation) touchEventsTarget[action]('click', s.preventClicks, true);\n        };\n        s.attachEvents = function () {\n            s.initEvents();\n        };\n        s.detachEvents = function () {\n            s.initEvents(true);\n        };\n        \n        /*=========================\n          Handle Clicks\n          ===========================*/\n        // Prevent Clicks\n        s.allowClick = true;\n        s.preventClicks = function (e) {\n            if (!s.allowClick) {\n                if (s.params.preventClicks) e.preventDefault();\n                if (s.params.preventClicksPropagation && s.animating) {\n                    e.stopPropagation();\n                    e.stopImmediatePropagation();\n                }\n            }\n        };\n        // Clicks\n        s.onClickNext = function (e) {\n            e.preventDefault();\n            if (s.isEnd && !s.params.loop) return;\n            s.slideNext();\n        };\n        s.onClickPrev = function (e) {\n            e.preventDefault();\n            if (s.isBeginning && !s.params.loop) return;\n            s.slidePrev();\n        };\n        s.onClickIndex = function (e) {\n            e.preventDefault();\n            var index = $(this).index() * s.params.slidesPerGroup;\n            if (s.params.loop) index = index + s.loopedSlides;\n            s.slideTo(index);\n        };\n        \n        /*=========================\n          Handle Touches\n          ===========================*/\n        function findElementInEvent(e, selector) {\n            var el = $(e.target);\n            if (!el.is(selector)) {\n                if (typeof selector === 'string') {\n                    el = el.parents(selector);\n                }\n                else if (selector.nodeType) {\n                    var found;\n                    el.parents().each(function (index, _el) {\n                        if (_el === selector) found = selector;\n                    });\n                    if (!found) return undefined;\n                    else return selector;\n                }\n            }\n            if (el.length === 0) {\n                return undefined;\n            }\n            return el[0];\n        }\n        s.updateClickedSlide = function (e) {\n            var slide = findElementInEvent(e, '.' + s.params.slideClass);\n            var slideFound = false;\n            if (slide) {\n                for (var i = 0; i < s.slides.length; i++) {\n                    if (s.slides[i] === slide) slideFound = true;\n                }\n            }\n        \n            if (slide && slideFound) {\n                s.clickedSlide = slide;\n                s.clickedIndex = $(slide).index();\n            }\n            else {\n                s.clickedSlide = undefined;\n                s.clickedIndex = undefined;\n                return;\n            }\n            if (s.params.slideToClickedSlide && s.clickedIndex !== undefined && s.clickedIndex !== s.activeIndex) {\n                var slideToIndex = s.clickedIndex,\n                    realIndex,\n                    duplicatedSlides;\n                if (s.params.loop) {\n                    if (s.animating) return;\n                    realIndex = $(s.clickedSlide).attr('data-swiper-slide-index');\n                    if (s.params.centeredSlides) {\n                        if ((slideToIndex < s.loopedSlides - s.params.slidesPerView/2) || (slideToIndex > s.slides.length - s.loopedSlides + s.params.slidesPerView/2)) {\n                            s.fixLoop();\n                            slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index=\"' + realIndex + '\"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index();\n                            setTimeout(function () {\n                                s.slideTo(slideToIndex);\n                            }, 0);\n                        }\n                        else {\n                            s.slideTo(slideToIndex);\n                        }\n                    }\n                    else {\n                        if (slideToIndex > s.slides.length - s.params.slidesPerView) {\n                            s.fixLoop();\n                            slideToIndex = s.wrapper.children('.' + s.params.slideClass + '[data-swiper-slide-index=\"' + realIndex + '\"]:not(.' + s.params.slideDuplicateClass + ')').eq(0).index();\n                            setTimeout(function () {\n                                s.slideTo(slideToIndex);\n                            }, 0);\n                        }\n                        else {\n                            s.slideTo(slideToIndex);\n                        }\n                    }\n                }\n                else {\n                    s.slideTo(slideToIndex);\n                }\n            }\n        };\n        \n        var isTouched,\n            isMoved,\n            allowTouchCallbacks,\n            touchStartTime,\n            isScrolling,\n            currentTranslate,\n            startTranslate,\n            allowThresholdMove,\n            // Form elements to match\n            formElements = 'input, select, textarea, button, video',\n            // Last click time\n            lastClickTime = Date.now(), clickTimeout,\n            //Velocities\n            velocities = [],\n            allowMomentumBounce;\n        \n        // Animating Flag\n        s.animating = false;\n        \n        // Touches information\n        s.touches = {\n            startX: 0,\n            startY: 0,\n            currentX: 0,\n            currentY: 0,\n            diff: 0\n        };\n        \n        // Touch handlers\n        var isTouchEvent, startMoving;\n        s.onTouchStart = function (e) {\n            if (e.originalEvent) e = e.originalEvent;\n            isTouchEvent = e.type === 'touchstart';\n            if (!isTouchEvent && 'which' in e && e.which === 3) return;\n            if (s.params.noSwiping && findElementInEvent(e, '.' + s.params.noSwipingClass)) {\n                s.allowClick = true;\n                return;\n            }\n            if (s.params.swipeHandler) {\n                if (!findElementInEvent(e, s.params.swipeHandler)) return;\n            }\n        \n            var startX = s.touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n            var startY = s.touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n        \n            // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore\n            if(s.device.ios && s.params.iOSEdgeSwipeDetection && startX <= s.params.iOSEdgeSwipeThreshold) {\n                return;\n            }\n        \n            isTouched = true;\n            isMoved = false;\n            allowTouchCallbacks = true;\n            isScrolling = undefined;\n            startMoving = undefined;\n            s.touches.startX = startX;\n            s.touches.startY = startY;\n            touchStartTime = Date.now();\n            s.allowClick = true;\n            s.updateContainerSize();\n            s.swipeDirection = undefined;\n            if (s.params.threshold > 0) allowThresholdMove = false;\n            if (e.type !== 'touchstart') {\n                var preventDefault = true;\n                if ($(e.target).is(formElements)) preventDefault = false;\n                if (document.activeElement && $(document.activeElement).is(formElements)) {\n                    document.activeElement.blur();\n                }\n                if (preventDefault) {\n                    e.preventDefault();\n                }\n            }\n            s.emit('onTouchStart', s, e);\n        };\n        \n        s.onTouchMove = function (e) {\n            if (e.originalEvent) e = e.originalEvent;\n            if (isTouchEvent && e.type === 'mousemove') return;\n            if (e.preventedByNestedSwiper) {\n                s.touches.startX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                s.touches.startY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                return;\n            }\n            if (s.params.onlyExternal) {\n                // isMoved = true;\n                s.allowClick = false;\n                if (isTouched) {\n                    s.touches.startX = s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                    s.touches.startY = s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n                    touchStartTime = Date.now();\n                }\n                return;\n            }\n            if (isTouchEvent && s.params.touchReleaseOnEdges && !s.params.loop) {\n                if (!s.isHorizontal()) {\n                    // Vertical\n                    if (\n                        (s.touches.currentY < s.touches.startY && s.translate <= s.maxTranslate()) ||\n                        (s.touches.currentY > s.touches.startY && s.translate >= s.minTranslate())\n                        ) {\n                        return;\n                    }\n                }\n                else {\n                    if (\n                        (s.touches.currentX < s.touches.startX && s.translate <= s.maxTranslate()) ||\n                        (s.touches.currentX > s.touches.startX && s.translate >= s.minTranslate())\n                        ) {\n                        return;\n                    }\n                }\n            }\n            if (isTouchEvent && document.activeElement) {\n                if (e.target === document.activeElement && $(e.target).is(formElements)) {\n                    isMoved = true;\n                    s.allowClick = false;\n                    return;\n                }\n            }\n            if (allowTouchCallbacks) {\n                s.emit('onTouchMove', s, e);\n            }\n            if (e.targetTouches && e.targetTouches.length > 1) return;\n        \n            s.touches.currentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n            s.touches.currentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n        \n            if (typeof isScrolling === 'undefined') {\n                var touchAngle;\n                if (s.isHorizontal() && s.touches.currentY === s.touches.startY || !s.isHorizontal() && s.touches.currentX !== s.touches.startX) {\n                    isScrolling = false;\n                }\n                else {\n                    touchAngle = Math.atan2(Math.abs(s.touches.currentY - s.touches.startY), Math.abs(s.touches.currentX - s.touches.startX)) * 180 / Math.PI;\n                    isScrolling = s.isHorizontal() ? touchAngle > s.params.touchAngle : (90 - touchAngle > s.params.touchAngle);\n                }\n            }\n            if (isScrolling) {\n                s.emit('onTouchMoveOpposite', s, e);\n            }\n            if (typeof startMoving === 'undefined' && s.browser.ieTouch) {\n                if (s.touches.currentX !== s.touches.startX || s.touches.currentY !== s.touches.startY) {\n                    startMoving = true;\n                }\n            }\n            if (!isTouched) return;\n            if (isScrolling)  {\n                isTouched = false;\n                return;\n            }\n            if (!startMoving && s.browser.ieTouch) {\n                return;\n            }\n            s.allowClick = false;\n            s.emit('onSliderMove', s, e);\n            e.preventDefault();\n            if (s.params.touchMoveStopPropagation && !s.params.nested) {\n                e.stopPropagation();\n            }\n        \n            if (!isMoved) {\n                if (params.loop) {\n                    s.fixLoop();\n                }\n                startTranslate = s.getWrapperTranslate();\n                s.setWrapperTransition(0);\n                if (s.animating) {\n                    s.wrapper.trigger('webkitTransitionEnd transitionend oTransitionEnd MSTransitionEnd msTransitionEnd');\n                }\n                if (s.params.autoplay && s.autoplaying) {\n                    if (s.params.autoplayDisableOnInteraction) {\n                        s.stopAutoplay();\n                    }\n                    else {\n                        s.pauseAutoplay();\n                    }\n                }\n                allowMomentumBounce = false;\n                //Grab Cursor\n                if (s.params.grabCursor && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) {\n                    s.setGrabCursor(true);\n                }\n            }\n            isMoved = true;\n        \n            var diff = s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY;\n        \n            diff = diff * s.params.touchRatio;\n            if (s.rtl) diff = -diff;\n        \n            s.swipeDirection = diff > 0 ? 'prev' : 'next';\n            currentTranslate = diff + startTranslate;\n        \n            var disableParentSwiper = true;\n            if ((diff > 0 && currentTranslate > s.minTranslate())) {\n                disableParentSwiper = false;\n                if (s.params.resistance) currentTranslate = s.minTranslate() - 1 + Math.pow(-s.minTranslate() + startTranslate + diff, s.params.resistanceRatio);\n            }\n            else if (diff < 0 && currentTranslate < s.maxTranslate()) {\n                disableParentSwiper = false;\n                if (s.params.resistance) currentTranslate = s.maxTranslate() + 1 - Math.pow(s.maxTranslate() - startTranslate - diff, s.params.resistanceRatio);\n            }\n        \n            if (disableParentSwiper) {\n                e.preventedByNestedSwiper = true;\n            }\n        \n            // Directions locks\n            if (!s.params.allowSwipeToNext && s.swipeDirection === 'next' && currentTranslate < startTranslate) {\n                currentTranslate = startTranslate;\n            }\n            if (!s.params.allowSwipeToPrev && s.swipeDirection === 'prev' && currentTranslate > startTranslate) {\n                currentTranslate = startTranslate;\n            }\n        \n        \n            // Threshold\n            if (s.params.threshold > 0) {\n                if (Math.abs(diff) > s.params.threshold || allowThresholdMove) {\n                    if (!allowThresholdMove) {\n                        allowThresholdMove = true;\n                        s.touches.startX = s.touches.currentX;\n                        s.touches.startY = s.touches.currentY;\n                        currentTranslate = startTranslate;\n                        s.touches.diff = s.isHorizontal() ? s.touches.currentX - s.touches.startX : s.touches.currentY - s.touches.startY;\n                        return;\n                    }\n                }\n                else {\n                    currentTranslate = startTranslate;\n                    return;\n                }\n            }\n        \n            if (!s.params.followFinger) return;\n        \n            // Update active index in free mode\n            if (s.params.freeMode || s.params.watchSlidesProgress) {\n                s.updateActiveIndex();\n            }\n            if (s.params.freeMode) {\n                //Velocity\n                if (velocities.length === 0) {\n                    velocities.push({\n                        position: s.touches[s.isHorizontal() ? 'startX' : 'startY'],\n                        time: touchStartTime\n                    });\n                }\n                velocities.push({\n                    position: s.touches[s.isHorizontal() ? 'currentX' : 'currentY'],\n                    time: (new window.Date()).getTime()\n                });\n            }\n            // Update progress\n            s.updateProgress(currentTranslate);\n            // Update translate\n            s.setWrapperTranslate(currentTranslate);\n        };\n        s.onTouchEnd = function (e) {\n            if (e.originalEvent) e = e.originalEvent;\n            if (allowTouchCallbacks) {\n                s.emit('onTouchEnd', s, e);\n            }\n            allowTouchCallbacks = false;\n            if (!isTouched) return;\n            //Return Grab Cursor\n            if (s.params.grabCursor && isMoved && isTouched  && (s.params.allowSwipeToNext === true || s.params.allowSwipeToPrev === true)) {\n                s.setGrabCursor(false);\n            }\n        \n            // Time diff\n            var touchEndTime = Date.now();\n            var timeDiff = touchEndTime - touchStartTime;\n        \n            // Tap, doubleTap, Click\n            if (s.allowClick) {\n                s.updateClickedSlide(e);\n                s.emit('onTap', s, e);\n                if (timeDiff < 300 && (touchEndTime - lastClickTime) > 300) {\n                    if (clickTimeout) clearTimeout(clickTimeout);\n                    clickTimeout = setTimeout(function () {\n                        if (!s) return;\n                        if (s.params.paginationHide && s.paginationContainer.length > 0 && !$(e.target).hasClass(s.params.bulletClass)) {\n                            s.paginationContainer.toggleClass(s.params.paginationHiddenClass);\n                        }\n                        s.emit('onClick', s, e);\n                    }, 300);\n        \n                }\n                if (timeDiff < 300 && (touchEndTime - lastClickTime) < 300) {\n                    if (clickTimeout) clearTimeout(clickTimeout);\n                    s.emit('onDoubleTap', s, e);\n                }\n            }\n        \n            lastClickTime = Date.now();\n            setTimeout(function () {\n                if (s) s.allowClick = true;\n            }, 0);\n        \n            if (!isTouched || !isMoved || !s.swipeDirection || s.touches.diff === 0 || currentTranslate === startTranslate) {\n                isTouched = isMoved = false;\n                return;\n            }\n            isTouched = isMoved = false;\n        \n            var currentPos;\n            if (s.params.followFinger) {\n                currentPos = s.rtl ? s.translate : -s.translate;\n            }\n            else {\n                currentPos = -currentTranslate;\n            }\n            if (s.params.freeMode) {\n                if (currentPos < -s.minTranslate()) {\n                    s.slideTo(s.activeIndex);\n                    return;\n                }\n                else if (currentPos > -s.maxTranslate()) {\n                    if (s.slides.length < s.snapGrid.length) {\n                        s.slideTo(s.snapGrid.length - 1);\n                    }\n                    else {\n                        s.slideTo(s.slides.length - 1);\n                    }\n                    return;\n                }\n        \n                if (s.params.freeModeMomentum) {\n                    if (velocities.length > 1) {\n                        var lastMoveEvent = velocities.pop(), velocityEvent = velocities.pop();\n        \n                        var distance = lastMoveEvent.position - velocityEvent.position;\n                        var time = lastMoveEvent.time - velocityEvent.time;\n                        s.velocity = distance / time;\n                        s.velocity = s.velocity / 2;\n                        if (Math.abs(s.velocity) < s.params.freeModeMinimumVelocity) {\n                            s.velocity = 0;\n                        }\n                        // this implies that the user stopped moving a finger then released.\n                        // There would be no events with distance zero, so the last event is stale.\n                        if (time > 150 || (new window.Date().getTime() - lastMoveEvent.time) > 300) {\n                            s.velocity = 0;\n                        }\n                    } else {\n                        s.velocity = 0;\n                    }\n                    s.velocity = s.velocity * s.params.freeModeMomentumVelocityRatio;\n        \n                    velocities.length = 0;\n                    var momentumDuration = 1000 * s.params.freeModeMomentumRatio;\n                    var momentumDistance = s.velocity * momentumDuration;\n        \n                    var newPosition = s.translate + momentumDistance;\n                    if (s.rtl) newPosition = - newPosition;\n                    var doBounce = false;\n                    var afterBouncePosition;\n                    var bounceAmount = Math.abs(s.velocity) * 20 * s.params.freeModeMomentumBounceRatio;\n                    if (newPosition < s.maxTranslate()) {\n                        if (s.params.freeModeMomentumBounce) {\n                            if (newPosition + s.maxTranslate() < -bounceAmount) {\n                                newPosition = s.maxTranslate() - bounceAmount;\n                            }\n                            afterBouncePosition = s.maxTranslate();\n                            doBounce = true;\n                            allowMomentumBounce = true;\n                        }\n                        else {\n                            newPosition = s.maxTranslate();\n                        }\n                    }\n                    else if (newPosition > s.minTranslate()) {\n                        if (s.params.freeModeMomentumBounce) {\n                            if (newPosition - s.minTranslate() > bounceAmount) {\n                                newPosition = s.minTranslate() + bounceAmount;\n                            }\n                            afterBouncePosition = s.minTranslate();\n                            doBounce = true;\n                            allowMomentumBounce = true;\n                        }\n                        else {\n                            newPosition = s.minTranslate();\n                        }\n                    }\n                    else if (s.params.freeModeSticky) {\n                        var j = 0,\n                            nextSlide;\n                        for (j = 0; j < s.snapGrid.length; j += 1) {\n                            if (s.snapGrid[j] > -newPosition) {\n                                nextSlide = j;\n                                break;\n                            }\n        \n                        }\n                        if (Math.abs(s.snapGrid[nextSlide] - newPosition) < Math.abs(s.snapGrid[nextSlide - 1] - newPosition) || s.swipeDirection === 'next') {\n                            newPosition = s.snapGrid[nextSlide];\n                        } else {\n                            newPosition = s.snapGrid[nextSlide - 1];\n                        }\n                        if (!s.rtl) newPosition = - newPosition;\n                    }\n                    //Fix duration\n                    if (s.velocity !== 0) {\n                        if (s.rtl) {\n                            momentumDuration = Math.abs((-newPosition - s.translate) / s.velocity);\n                        }\n                        else {\n                            momentumDuration = Math.abs((newPosition - s.translate) / s.velocity);\n                        }\n                    }\n                    else if (s.params.freeModeSticky) {\n                        s.slideReset();\n                        return;\n                    }\n        \n                    if (s.params.freeModeMomentumBounce && doBounce) {\n                        s.updateProgress(afterBouncePosition);\n                        s.setWrapperTransition(momentumDuration);\n                        s.setWrapperTranslate(newPosition);\n                        s.onTransitionStart();\n                        s.animating = true;\n                        s.wrapper.transitionEnd(function () {\n                            if (!s || !allowMomentumBounce) return;\n                            s.emit('onMomentumBounce', s);\n        \n                            s.setWrapperTransition(s.params.speed);\n                            s.setWrapperTranslate(afterBouncePosition);\n                            s.wrapper.transitionEnd(function () {\n                                if (!s) return;\n                                s.onTransitionEnd();\n                            });\n                        });\n                    } else if (s.velocity) {\n                        s.updateProgress(newPosition);\n                        s.setWrapperTransition(momentumDuration);\n                        s.setWrapperTranslate(newPosition);\n                        s.onTransitionStart();\n                        if (!s.animating) {\n                            s.animating = true;\n                            s.wrapper.transitionEnd(function () {\n                                if (!s) return;\n                                s.onTransitionEnd();\n                            });\n                        }\n        \n                    } else {\n                        s.updateProgress(newPosition);\n                    }\n        \n                    s.updateActiveIndex();\n                }\n                if (!s.params.freeModeMomentum || timeDiff >= s.params.longSwipesMs) {\n                    s.updateProgress();\n                    s.updateActiveIndex();\n                }\n                return;\n            }\n        \n            // Find current slide\n            var i, stopIndex = 0, groupSize = s.slidesSizesGrid[0];\n            for (i = 0; i < s.slidesGrid.length; i += s.params.slidesPerGroup) {\n                if (typeof s.slidesGrid[i + s.params.slidesPerGroup] !== 'undefined') {\n                    if (currentPos >= s.slidesGrid[i] && currentPos < s.slidesGrid[i + s.params.slidesPerGroup]) {\n                        stopIndex = i;\n                        groupSize = s.slidesGrid[i + s.params.slidesPerGroup] - s.slidesGrid[i];\n                    }\n                }\n                else {\n                    if (currentPos >= s.slidesGrid[i]) {\n                        stopIndex = i;\n                        groupSize = s.slidesGrid[s.slidesGrid.length - 1] - s.slidesGrid[s.slidesGrid.length - 2];\n                    }\n                }\n            }\n        \n            // Find current slide size\n            var ratio = (currentPos - s.slidesGrid[stopIndex]) / groupSize;\n        \n            if (timeDiff > s.params.longSwipesMs) {\n                // Long touches\n                if (!s.params.longSwipes) {\n                    s.slideTo(s.activeIndex);\n                    return;\n                }\n                if (s.swipeDirection === 'next') {\n                    if (ratio >= s.params.longSwipesRatio) s.slideTo(stopIndex + s.params.slidesPerGroup);\n                    else s.slideTo(stopIndex);\n        \n                }\n                if (s.swipeDirection === 'prev') {\n                    if (ratio > (1 - s.params.longSwipesRatio)) s.slideTo(stopIndex + s.params.slidesPerGroup);\n                    else s.slideTo(stopIndex);\n                }\n            }\n            else {\n                // Short swipes\n                if (!s.params.shortSwipes) {\n                    s.slideTo(s.activeIndex);\n                    return;\n                }\n                if (s.swipeDirection === 'next') {\n                    s.slideTo(stopIndex + s.params.slidesPerGroup);\n        \n                }\n                if (s.swipeDirection === 'prev') {\n                    s.slideTo(stopIndex);\n                }\n            }\n        };\n        /*=========================\n          Transitions\n          ===========================*/\n        s._slideTo = function (slideIndex, speed) {\n            return s.slideTo(slideIndex, speed, true, true);\n        };\n        s.slideTo = function (slideIndex, speed, runCallbacks, internal) {\n            if (typeof runCallbacks === 'undefined') runCallbacks = true;\n            if (typeof slideIndex === 'undefined') slideIndex = 0;\n            if (slideIndex < 0) slideIndex = 0;\n            s.snapIndex = Math.floor(slideIndex / s.params.slidesPerGroup);\n            if (s.snapIndex >= s.snapGrid.length) s.snapIndex = s.snapGrid.length - 1;\n        \n            var translate = - s.snapGrid[s.snapIndex];\n            // Stop autoplay\n            if (s.params.autoplay && s.autoplaying) {\n                if (internal || !s.params.autoplayDisableOnInteraction) {\n                    s.pauseAutoplay(speed);\n                }\n                else {\n                    s.stopAutoplay();\n                }\n            }\n            // Update progress\n            s.updateProgress(translate);\n        \n            // Normalize slideIndex\n            if(s.params.normalizeSlideIndex){\n                for (var i = 0; i < s.slidesGrid.length; i++) {\n                    if (- Math.floor(translate * 100) >= Math.floor(s.slidesGrid[i] * 100)) {\n                        slideIndex = i;\n                    }\n                }\n            }\n        \n            // Directions locks\n            if (!s.params.allowSwipeToNext && translate < s.translate && translate < s.minTranslate()) {\n                return false;\n            }\n            if (!s.params.allowSwipeToPrev && translate > s.translate && translate > s.maxTranslate()) {\n                if ((s.activeIndex || 0) !== slideIndex ) return false;\n            }\n        \n            // Update Index\n            if (typeof speed === 'undefined') speed = s.params.speed;\n            s.previousIndex = s.activeIndex || 0;\n            s.activeIndex = slideIndex;\n            s.updateRealIndex();\n            if ((s.rtl && -translate === s.translate) || (!s.rtl && translate === s.translate)) {\n                // Update Height\n                if (s.params.autoHeight) {\n                    s.updateAutoHeight();\n                }\n                s.updateClasses();\n                if (s.params.effect !== 'slide') {\n                    s.setWrapperTranslate(translate);\n                }\n                return false;\n            }\n            s.updateClasses();\n            s.onTransitionStart(runCallbacks);\n        \n            if (speed === 0 || s.browser.lteIE9) {\n                s.setWrapperTranslate(translate);\n                s.setWrapperTransition(0);\n                s.onTransitionEnd(runCallbacks);\n            }\n            else {\n                s.setWrapperTranslate(translate);\n                s.setWrapperTransition(speed);\n                if (!s.animating) {\n                    s.animating = true;\n                    s.wrapper.transitionEnd(function () {\n                        if (!s) return;\n                        s.onTransitionEnd(runCallbacks);\n                    });\n                }\n        \n            }\n        \n            return true;\n        };\n        \n        s.onTransitionStart = function (runCallbacks) {\n            if (typeof runCallbacks === 'undefined') runCallbacks = true;\n            if (s.params.autoHeight) {\n                s.updateAutoHeight();\n            }\n            if (s.lazy) s.lazy.onTransitionStart();\n            if (runCallbacks) {\n                s.emit('onTransitionStart', s);\n                if (s.activeIndex !== s.previousIndex) {\n                    s.emit('onSlideChangeStart', s);\n                    if (s.activeIndex > s.previousIndex) {\n                        s.emit('onSlideNextStart', s);\n                    }\n                    else {\n                        s.emit('onSlidePrevStart', s);\n                    }\n                }\n        \n            }\n        };\n        s.onTransitionEnd = function (runCallbacks) {\n            s.animating = false;\n            s.setWrapperTransition(0);\n            if (typeof runCallbacks === 'undefined') runCallbacks = true;\n            if (s.lazy) s.lazy.onTransitionEnd();\n            if (runCallbacks) {\n                s.emit('onTransitionEnd', s);\n                if (s.activeIndex !== s.previousIndex) {\n                    s.emit('onSlideChangeEnd', s);\n                    if (s.activeIndex > s.previousIndex) {\n                        s.emit('onSlideNextEnd', s);\n                    }\n                    else {\n                        s.emit('onSlidePrevEnd', s);\n                    }\n                }\n            }\n            if (s.params.history && s.history) {\n                s.history.setHistory(s.params.history, s.activeIndex);\n            }\n            if (s.params.hashnav && s.hashnav) {\n                s.hashnav.setHash();\n            }\n        \n        };\n        s.slideNext = function (runCallbacks, speed, internal) {\n            if (s.params.loop) {\n                if (s.animating) return false;\n                s.fixLoop();\n                var clientLeft = s.container[0].clientLeft;\n                return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal);\n            }\n            else return s.slideTo(s.activeIndex + s.params.slidesPerGroup, speed, runCallbacks, internal);\n        };\n        s._slideNext = function (speed) {\n            return s.slideNext(true, speed, true);\n        };\n        s.slidePrev = function (runCallbacks, speed, internal) {\n            if (s.params.loop) {\n                if (s.animating) return false;\n                s.fixLoop();\n                var clientLeft = s.container[0].clientLeft;\n                return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal);\n            }\n            else return s.slideTo(s.activeIndex - 1, speed, runCallbacks, internal);\n        };\n        s._slidePrev = function (speed) {\n            return s.slidePrev(true, speed, true);\n        };\n        s.slideReset = function (runCallbacks, speed, internal) {\n            return s.slideTo(s.activeIndex, speed, runCallbacks);\n        };\n        \n        s.disableTouchControl = function () {\n            s.params.onlyExternal = true;\n            return true;\n        };\n        s.enableTouchControl = function () {\n            s.params.onlyExternal = false;\n            return true;\n        };\n        \n        /*=========================\n          Translate/transition helpers\n          ===========================*/\n        s.setWrapperTransition = function (duration, byController) {\n            s.wrapper.transition(duration);\n            if (s.params.effect !== 'slide' && s.effects[s.params.effect]) {\n                s.effects[s.params.effect].setTransition(duration);\n            }\n            if (s.params.parallax && s.parallax) {\n                s.parallax.setTransition(duration);\n            }\n            if (s.params.scrollbar && s.scrollbar) {\n                s.scrollbar.setTransition(duration);\n            }\n            if (s.params.control && s.controller) {\n                s.controller.setTransition(duration, byController);\n            }\n            s.emit('onSetTransition', s, duration);\n        };\n        s.setWrapperTranslate = function (translate, updateActiveIndex, byController) {\n            var x = 0, y = 0, z = 0;\n            if (s.isHorizontal()) {\n                x = s.rtl ? -translate : translate;\n            }\n            else {\n                y = translate;\n            }\n        \n            if (s.params.roundLengths) {\n                x = round(x);\n                y = round(y);\n            }\n        \n            if (!s.params.virtualTranslate) {\n                if (s.support.transforms3d) s.wrapper.transform('translate3d(' + x + 'px, ' + y + 'px, ' + z + 'px)');\n                else s.wrapper.transform('translate(' + x + 'px, ' + y + 'px)');\n            }\n        \n            s.translate = s.isHorizontal() ? x : y;\n        \n            // Check if we need to update progress\n            var progress;\n            var translatesDiff = s.maxTranslate() - s.minTranslate();\n            if (translatesDiff === 0) {\n                progress = 0;\n            }\n            else {\n                progress = (translate - s.minTranslate()) / (translatesDiff);\n            }\n            if (progress !== s.progress) {\n                s.updateProgress(translate);\n            }\n        \n            if (updateActiveIndex) s.updateActiveIndex();\n            if (s.params.effect !== 'slide' && s.effects[s.params.effect]) {\n                s.effects[s.params.effect].setTranslate(s.translate);\n            }\n            if (s.params.parallax && s.parallax) {\n                s.parallax.setTranslate(s.translate);\n            }\n            if (s.params.scrollbar && s.scrollbar) {\n                s.scrollbar.setTranslate(s.translate);\n            }\n            if (s.params.control && s.controller) {\n                s.controller.setTranslate(s.translate, byController);\n            }\n            s.emit('onSetTranslate', s, s.translate);\n        };\n        \n        s.getTranslate = function (el, axis) {\n            var matrix, curTransform, curStyle, transformMatrix;\n        \n            // automatic axis detection\n            if (typeof axis === 'undefined') {\n                axis = 'x';\n            }\n        \n            if (s.params.virtualTranslate) {\n                return s.rtl ? -s.translate : s.translate;\n            }\n        \n            curStyle = window.getComputedStyle(el, null);\n            if (window.WebKitCSSMatrix) {\n                curTransform = curStyle.transform || curStyle.webkitTransform;\n                if (curTransform.split(',').length > 6) {\n                    curTransform = curTransform.split(', ').map(function(a){\n                        return a.replace(',','.');\n                    }).join(', ');\n                }\n                // Some old versions of Webkit choke when 'none' is passed; pass\n                // empty string instead in this case\n                transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n            }\n            else {\n                transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform  || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n                matrix = transformMatrix.toString().split(',');\n            }\n        \n            if (axis === 'x') {\n                //Latest Chrome and webkits Fix\n                if (window.WebKitCSSMatrix)\n                    curTransform = transformMatrix.m41;\n                //Crazy IE10 Matrix\n                else if (matrix.length === 16)\n                    curTransform = parseFloat(matrix[12]);\n                //Normal Browsers\n                else\n                    curTransform = parseFloat(matrix[4]);\n            }\n            if (axis === 'y') {\n                //Latest Chrome and webkits Fix\n                if (window.WebKitCSSMatrix)\n                    curTransform = transformMatrix.m42;\n                //Crazy IE10 Matrix\n                else if (matrix.length === 16)\n                    curTransform = parseFloat(matrix[13]);\n                //Normal Browsers\n                else\n                    curTransform = parseFloat(matrix[5]);\n            }\n            if (s.rtl && curTransform) curTransform = -curTransform;\n            return curTransform || 0;\n        };\n        s.getWrapperTranslate = function (axis) {\n            if (typeof axis === 'undefined') {\n                axis = s.isHorizontal() ? 'x' : 'y';\n            }\n            return s.getTranslate(s.wrapper[0], axis);\n        };\n        \n        /*=========================\n          Observer\n          ===========================*/\n        s.observers = [];\n        function initObserver(target, options) {\n            options = options || {};\n            // create an observer instance\n            var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n            var observer = new ObserverFunc(function (mutations) {\n                mutations.forEach(function (mutation) {\n                    s.onResize(true);\n                    s.emit('onObserverUpdate', s, mutation);\n                });\n            });\n        \n            observer.observe(target, {\n                attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n                childList: typeof options.childList === 'undefined' ? true : options.childList,\n                characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n            });\n        \n            s.observers.push(observer);\n        }\n        s.initObservers = function () {\n            if (s.params.observeParents) {\n                var containerParents = s.container.parents();\n                for (var i = 0; i < containerParents.length; i++) {\n                    initObserver(containerParents[i]);\n                }\n            }\n        \n            // Observe container\n            initObserver(s.container[0], {childList: false});\n        \n            // Observe wrapper\n            initObserver(s.wrapper[0], {attributes: false});\n        };\n        s.disconnectObservers = function () {\n            for (var i = 0; i < s.observers.length; i++) {\n                s.observers[i].disconnect();\n            }\n            s.observers = [];\n        };\n        /*=========================\n          Loop\n          ===========================*/\n        // Create looped slides\n        s.createLoop = function () {\n            // Remove duplicated slides\n            s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove();\n        \n            var slides = s.wrapper.children('.' + s.params.slideClass);\n        \n            if(s.params.slidesPerView === 'auto' && !s.params.loopedSlides) s.params.loopedSlides = slides.length;\n        \n            s.loopedSlides = parseInt(s.params.loopedSlides || s.params.slidesPerView, 10);\n            s.loopedSlides = s.loopedSlides + s.params.loopAdditionalSlides;\n            if (s.loopedSlides > slides.length) {\n                s.loopedSlides = slides.length;\n            }\n        \n            var prependSlides = [], appendSlides = [], i;\n            slides.each(function (index, el) {\n                var slide = $(this);\n                if (index < s.loopedSlides) appendSlides.push(el);\n                if (index < slides.length && index >= slides.length - s.loopedSlides) prependSlides.push(el);\n                slide.attr('data-swiper-slide-index', index);\n            });\n            for (i = 0; i < appendSlides.length; i++) {\n                s.wrapper.append($(appendSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass));\n            }\n            for (i = prependSlides.length - 1; i >= 0; i--) {\n                s.wrapper.prepend($(prependSlides[i].cloneNode(true)).addClass(s.params.slideDuplicateClass));\n            }\n        };\n        s.destroyLoop = function () {\n            s.wrapper.children('.' + s.params.slideClass + '.' + s.params.slideDuplicateClass).remove();\n            s.slides.removeAttr('data-swiper-slide-index');\n        };\n        s.reLoop = function (updatePosition) {\n            var oldIndex = s.activeIndex - s.loopedSlides;\n            s.destroyLoop();\n            s.createLoop();\n            s.updateSlidesSize();\n            if (updatePosition) {\n                s.slideTo(oldIndex + s.loopedSlides, 0, false);\n            }\n        \n        };\n        s.fixLoop = function () {\n            var newIndex;\n            //Fix For Negative Oversliding\n            if (s.activeIndex < s.loopedSlides) {\n                newIndex = s.slides.length - s.loopedSlides * 3 + s.activeIndex;\n                newIndex = newIndex + s.loopedSlides;\n                s.slideTo(newIndex, 0, false, true);\n            }\n            //Fix For Positive Oversliding\n            else if ((s.params.slidesPerView === 'auto' && s.activeIndex >= s.loopedSlides * 2) || (s.activeIndex > s.slides.length - s.params.slidesPerView * 2)) {\n                newIndex = -s.slides.length + s.activeIndex + s.loopedSlides;\n                newIndex = newIndex + s.loopedSlides;\n                s.slideTo(newIndex, 0, false, true);\n            }\n        };\n        /*=========================\n          Append/Prepend/Remove Slides\n          ===========================*/\n        s.appendSlide = function (slides) {\n            if (s.params.loop) {\n                s.destroyLoop();\n            }\n            if (typeof slides === 'object' && slides.length) {\n                for (var i = 0; i < slides.length; i++) {\n                    if (slides[i]) s.wrapper.append(slides[i]);\n                }\n            }\n            else {\n                s.wrapper.append(slides);\n            }\n            if (s.params.loop) {\n                s.createLoop();\n            }\n            if (!(s.params.observer && s.support.observer)) {\n                s.update(true);\n            }\n        };\n        s.prependSlide = function (slides) {\n            if (s.params.loop) {\n                s.destroyLoop();\n            }\n            var newActiveIndex = s.activeIndex + 1;\n            if (typeof slides === 'object' && slides.length) {\n                for (var i = 0; i < slides.length; i++) {\n                    if (slides[i]) s.wrapper.prepend(slides[i]);\n                }\n                newActiveIndex = s.activeIndex + slides.length;\n            }\n            else {\n                s.wrapper.prepend(slides);\n            }\n            if (s.params.loop) {\n                s.createLoop();\n            }\n            if (!(s.params.observer && s.support.observer)) {\n                s.update(true);\n            }\n            s.slideTo(newActiveIndex, 0, false);\n        };\n        s.removeSlide = function (slidesIndexes) {\n            if (s.params.loop) {\n                s.destroyLoop();\n                s.slides = s.wrapper.children('.' + s.params.slideClass);\n            }\n            var newActiveIndex = s.activeIndex,\n                indexToRemove;\n            if (typeof slidesIndexes === 'object' && slidesIndexes.length) {\n                for (var i = 0; i < slidesIndexes.length; i++) {\n                    indexToRemove = slidesIndexes[i];\n                    if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove();\n                    if (indexToRemove < newActiveIndex) newActiveIndex--;\n                }\n                newActiveIndex = Math.max(newActiveIndex, 0);\n            }\n            else {\n                indexToRemove = slidesIndexes;\n                if (s.slides[indexToRemove]) s.slides.eq(indexToRemove).remove();\n                if (indexToRemove < newActiveIndex) newActiveIndex--;\n                newActiveIndex = Math.max(newActiveIndex, 0);\n            }\n        \n            if (s.params.loop) {\n                s.createLoop();\n            }\n        \n            if (!(s.params.observer && s.support.observer)) {\n                s.update(true);\n            }\n            if (s.params.loop) {\n                s.slideTo(newActiveIndex + s.loopedSlides, 0, false);\n            }\n            else {\n                s.slideTo(newActiveIndex, 0, false);\n            }\n        \n        };\n        s.removeAllSlides = function () {\n            var slidesIndexes = [];\n            for (var i = 0; i < s.slides.length; i++) {\n                slidesIndexes.push(i);\n            }\n            s.removeSlide(slidesIndexes);\n        };\n        \n    \n        /*=========================\n          Effects\n          ===========================*/\n        s.effects = {\n            fade: {\n                setTranslate: function () {\n                    for (var i = 0; i < s.slides.length; i++) {\n                        var slide = s.slides.eq(i);\n                        var offset = slide[0].swiperSlideOffset;\n                        var tx = -offset;\n                        if (!s.params.virtualTranslate) tx = tx - s.translate;\n                        var ty = 0;\n                        if (!s.isHorizontal()) {\n                            ty = tx;\n                            tx = 0;\n                        }\n                        var slideOpacity = s.params.fade.crossFade ?\n                                Math.max(1 - Math.abs(slide[0].progress), 0) :\n                                1 + Math.min(Math.max(slide[0].progress, -1), 0);\n                        slide\n                            .css({\n                                opacity: slideOpacity\n                            })\n                            .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px)');\n        \n                    }\n        \n                },\n                setTransition: function (duration) {\n                    s.slides.transition(duration);\n                    if (s.params.virtualTranslate && duration !== 0) {\n                        var eventTriggered = false;\n                        s.slides.transitionEnd(function () {\n                            if (eventTriggered) return;\n                            if (!s) return;\n                            eventTriggered = true;\n                            s.animating = false;\n                            var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'];\n                            for (var i = 0; i < triggerEvents.length; i++) {\n                                s.wrapper.trigger(triggerEvents[i]);\n                            }\n                        });\n                    }\n                }\n            },\n            flip: {\n                setTranslate: function () {\n                    for (var i = 0; i < s.slides.length; i++) {\n                        var slide = s.slides.eq(i);\n                        var progress = slide[0].progress;\n                        if (s.params.flip.limitRotation) {\n                            progress = Math.max(Math.min(slide[0].progress, 1), -1);\n                        }\n                        var offset = slide[0].swiperSlideOffset;\n                        var rotate = -180 * progress,\n                            rotateY = rotate,\n                            rotateX = 0,\n                            tx = -offset,\n                            ty = 0;\n                        if (!s.isHorizontal()) {\n                            ty = tx;\n                            tx = 0;\n                            rotateX = -rotateY;\n                            rotateY = 0;\n                        }\n                        else if (s.rtl) {\n                            rotateY = -rotateY;\n                        }\n        \n                        slide[0].style.zIndex = -Math.abs(Math.round(progress)) + s.slides.length;\n        \n                        if (s.params.flip.slideShadows) {\n                            //Set shadows\n                            var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top');\n                            var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom');\n                            if (shadowBefore.length === 0) {\n                                shadowBefore = $('<div class=\"swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '\"></div>');\n                                slide.append(shadowBefore);\n                            }\n                            if (shadowAfter.length === 0) {\n                                shadowAfter = $('<div class=\"swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '\"></div>');\n                                slide.append(shadowAfter);\n                            }\n                            if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n                            if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n                        }\n        \n                        slide\n                            .transform('translate3d(' + tx + 'px, ' + ty + 'px, 0px) rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)');\n                    }\n                },\n                setTransition: function (duration) {\n                    s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);\n                    if (s.params.virtualTranslate && duration !== 0) {\n                        var eventTriggered = false;\n                        s.slides.eq(s.activeIndex).transitionEnd(function () {\n                            if (eventTriggered) return;\n                            if (!s) return;\n                            if (!$(this).hasClass(s.params.slideActiveClass)) return;\n                            eventTriggered = true;\n                            s.animating = false;\n                            var triggerEvents = ['webkitTransitionEnd', 'transitionend', 'oTransitionEnd', 'MSTransitionEnd', 'msTransitionEnd'];\n                            for (var i = 0; i < triggerEvents.length; i++) {\n                                s.wrapper.trigger(triggerEvents[i]);\n                            }\n                        });\n                    }\n                }\n            },\n            cube: {\n                setTranslate: function () {\n                    var wrapperRotate = 0, cubeShadow;\n                    if (s.params.cube.shadow) {\n                        if (s.isHorizontal()) {\n                            cubeShadow = s.wrapper.find('.swiper-cube-shadow');\n                            if (cubeShadow.length === 0) {\n                                cubeShadow = $('<div class=\"swiper-cube-shadow\"></div>');\n                                s.wrapper.append(cubeShadow);\n                            }\n                            cubeShadow.css({height: s.width + 'px'});\n                        }\n                        else {\n                            cubeShadow = s.container.find('.swiper-cube-shadow');\n                            if (cubeShadow.length === 0) {\n                                cubeShadow = $('<div class=\"swiper-cube-shadow\"></div>');\n                                s.container.append(cubeShadow);\n                            }\n                        }\n                    }\n                    for (var i = 0; i < s.slides.length; i++) {\n                        var slide = s.slides.eq(i);\n                        var slideAngle = i * 90;\n                        var round = Math.floor(slideAngle / 360);\n                        if (s.rtl) {\n                            slideAngle = -slideAngle;\n                            round = Math.floor(-slideAngle / 360);\n                        }\n                        var progress = Math.max(Math.min(slide[0].progress, 1), -1);\n                        var tx = 0, ty = 0, tz = 0;\n                        if (i % 4 === 0) {\n                            tx = - round * 4 * s.size;\n                            tz = 0;\n                        }\n                        else if ((i - 1) % 4 === 0) {\n                            tx = 0;\n                            tz = - round * 4 * s.size;\n                        }\n                        else if ((i - 2) % 4 === 0) {\n                            tx = s.size + round * 4 * s.size;\n                            tz = s.size;\n                        }\n                        else if ((i - 3) % 4 === 0) {\n                            tx = - s.size;\n                            tz = 3 * s.size + s.size * 4 * round;\n                        }\n                        if (s.rtl) {\n                            tx = -tx;\n                        }\n        \n                        if (!s.isHorizontal()) {\n                            ty = tx;\n                            tx = 0;\n                        }\n        \n                        var transform = 'rotateX(' + (s.isHorizontal() ? 0 : -slideAngle) + 'deg) rotateY(' + (s.isHorizontal() ? slideAngle : 0) + 'deg) translate3d(' + tx + 'px, ' + ty + 'px, ' + tz + 'px)';\n                        if (progress <= 1 && progress > -1) {\n                            wrapperRotate = i * 90 + progress * 90;\n                            if (s.rtl) wrapperRotate = -i * 90 - progress * 90;\n                        }\n                        slide.transform(transform);\n                        if (s.params.cube.slideShadows) {\n                            //Set shadows\n                            var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top');\n                            var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom');\n                            if (shadowBefore.length === 0) {\n                                shadowBefore = $('<div class=\"swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '\"></div>');\n                                slide.append(shadowBefore);\n                            }\n                            if (shadowAfter.length === 0) {\n                                shadowAfter = $('<div class=\"swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '\"></div>');\n                                slide.append(shadowAfter);\n                            }\n                            if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);\n                            if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);\n                        }\n                    }\n                    s.wrapper.css({\n                        '-webkit-transform-origin': '50% 50% -' + (s.size / 2) + 'px',\n                        '-moz-transform-origin': '50% 50% -' + (s.size / 2) + 'px',\n                        '-ms-transform-origin': '50% 50% -' + (s.size / 2) + 'px',\n                        'transform-origin': '50% 50% -' + (s.size / 2) + 'px'\n                    });\n        \n                    if (s.params.cube.shadow) {\n                        if (s.isHorizontal()) {\n                            cubeShadow.transform('translate3d(0px, ' + (s.width / 2 + s.params.cube.shadowOffset) + 'px, ' + (-s.width / 2) + 'px) rotateX(90deg) rotateZ(0deg) scale(' + (s.params.cube.shadowScale) + ')');\n                        }\n                        else {\n                            var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;\n                            var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);\n                            var scale1 = s.params.cube.shadowScale,\n                                scale2 = s.params.cube.shadowScale / multiplier,\n                                offset = s.params.cube.shadowOffset;\n                            cubeShadow.transform('scale3d(' + scale1 + ', 1, ' + scale2 + ') translate3d(0px, ' + (s.height / 2 + offset) + 'px, ' + (-s.height / 2 / scale2) + 'px) rotateX(-90deg)');\n                        }\n                    }\n                    var zFactor = (s.isSafari || s.isUiWebView) ? (-s.size / 2) : 0;\n                    s.wrapper.transform('translate3d(0px,0,' + zFactor + 'px) rotateX(' + (s.isHorizontal() ? 0 : wrapperRotate) + 'deg) rotateY(' + (s.isHorizontal() ? -wrapperRotate : 0) + 'deg)');\n                },\n                setTransition: function (duration) {\n                    s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);\n                    if (s.params.cube.shadow && !s.isHorizontal()) {\n                        s.container.find('.swiper-cube-shadow').transition(duration);\n                    }\n                }\n            },\n            coverflow: {\n                setTranslate: function () {\n                    var transform = s.translate;\n                    var center = s.isHorizontal() ? -transform + s.width / 2 : -transform + s.height / 2;\n                    var rotate = s.isHorizontal() ? s.params.coverflow.rotate: -s.params.coverflow.rotate;\n                    var translate = s.params.coverflow.depth;\n                    //Each slide offset from center\n                    for (var i = 0, length = s.slides.length; i < length; i++) {\n                        var slide = s.slides.eq(i);\n                        var slideSize = s.slidesSizesGrid[i];\n                        var slideOffset = slide[0].swiperSlideOffset;\n                        var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * s.params.coverflow.modifier;\n        \n                        var rotateY = s.isHorizontal() ? rotate * offsetMultiplier : 0;\n                        var rotateX = s.isHorizontal() ? 0 : rotate * offsetMultiplier;\n                        // var rotateZ = 0\n                        var translateZ = -translate * Math.abs(offsetMultiplier);\n        \n                        var translateY = s.isHorizontal() ? 0 : s.params.coverflow.stretch * (offsetMultiplier);\n                        var translateX = s.isHorizontal() ? s.params.coverflow.stretch * (offsetMultiplier) : 0;\n        \n                        //Fix for ultra small values\n                        if (Math.abs(translateX) < 0.001) translateX = 0;\n                        if (Math.abs(translateY) < 0.001) translateY = 0;\n                        if (Math.abs(translateZ) < 0.001) translateZ = 0;\n                        if (Math.abs(rotateY) < 0.001) rotateY = 0;\n                        if (Math.abs(rotateX) < 0.001) rotateX = 0;\n        \n                        var slideTransform = 'translate3d(' + translateX + 'px,' + translateY + 'px,' + translateZ + 'px)  rotateX(' + rotateX + 'deg) rotateY(' + rotateY + 'deg)';\n        \n                        slide.transform(slideTransform);\n                        slide[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;\n                        if (s.params.coverflow.slideShadows) {\n                            //Set shadows\n                            var shadowBefore = s.isHorizontal() ? slide.find('.swiper-slide-shadow-left') : slide.find('.swiper-slide-shadow-top');\n                            var shadowAfter = s.isHorizontal() ? slide.find('.swiper-slide-shadow-right') : slide.find('.swiper-slide-shadow-bottom');\n                            if (shadowBefore.length === 0) {\n                                shadowBefore = $('<div class=\"swiper-slide-shadow-' + (s.isHorizontal() ? 'left' : 'top') + '\"></div>');\n                                slide.append(shadowBefore);\n                            }\n                            if (shadowAfter.length === 0) {\n                                shadowAfter = $('<div class=\"swiper-slide-shadow-' + (s.isHorizontal() ? 'right' : 'bottom') + '\"></div>');\n                                slide.append(shadowAfter);\n                            }\n                            if (shadowBefore.length) shadowBefore[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;\n                            if (shadowAfter.length) shadowAfter[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0;\n                        }\n                    }\n        \n                    //Set correct perspective for IE10\n                    if (s.browser.ie) {\n                        var ws = s.wrapper[0].style;\n                        ws.perspectiveOrigin = center + 'px 50%';\n                    }\n                },\n                setTransition: function (duration) {\n                    s.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);\n                }\n            }\n        };\n    \n        /*=========================\n          Images Lazy Loading\n          ===========================*/\n        s.lazy = {\n            initialImageLoaded: false,\n            loadImageInSlide: function (index, loadInDuplicate) {\n                if (typeof index === 'undefined') return;\n                if (typeof loadInDuplicate === 'undefined') loadInDuplicate = true;\n                if (s.slides.length === 0) return;\n        \n                var slide = s.slides.eq(index);\n                var img = slide.find('.' + s.params.lazyLoadingClass + ':not(.' + s.params.lazyStatusLoadedClass + '):not(.' + s.params.lazyStatusLoadingClass + ')');\n                if (slide.hasClass(s.params.lazyLoadingClass) && !slide.hasClass(s.params.lazyStatusLoadedClass) && !slide.hasClass(s.params.lazyStatusLoadingClass)) {\n                    img = img.add(slide[0]);\n                }\n                if (img.length === 0) return;\n        \n                img.each(function () {\n                    var _img = $(this);\n                    _img.addClass(s.params.lazyStatusLoadingClass);\n                    var background = _img.attr('data-background');\n                    var src = _img.attr('data-src'),\n                        srcset = _img.attr('data-srcset'),\n                        sizes = _img.attr('data-sizes');\n                    s.loadImage(_img[0], (src || background), srcset, sizes, false, function () {\n                        if (background) {\n                            _img.css('background-image', 'url(\"' + background + '\")');\n                            _img.removeAttr('data-background');\n                        }\n                        else {\n                            if (srcset) {\n                                _img.attr('srcset', srcset);\n                                _img.removeAttr('data-srcset');\n                            }\n                            if (sizes) {\n                                _img.attr('sizes', sizes);\n                                _img.removeAttr('data-sizes');\n                            }\n                            if (src) {\n                                _img.attr('src', src);\n                                _img.removeAttr('data-src');\n                            }\n        \n                        }\n        \n                        _img.addClass(s.params.lazyStatusLoadedClass).removeClass(s.params.lazyStatusLoadingClass);\n                        slide.find('.' + s.params.lazyPreloaderClass + ', .' + s.params.preloaderClass).remove();\n                        if (s.params.loop && loadInDuplicate) {\n                            var slideOriginalIndex = slide.attr('data-swiper-slide-index');\n                            if (slide.hasClass(s.params.slideDuplicateClass)) {\n                                var originalSlide = s.wrapper.children('[data-swiper-slide-index=\"' + slideOriginalIndex + '\"]:not(.' + s.params.slideDuplicateClass + ')');\n                                s.lazy.loadImageInSlide(originalSlide.index(), false);\n                            }\n                            else {\n                                var duplicatedSlide = s.wrapper.children('.' + s.params.slideDuplicateClass + '[data-swiper-slide-index=\"' + slideOriginalIndex + '\"]');\n                                s.lazy.loadImageInSlide(duplicatedSlide.index(), false);\n                            }\n                        }\n                        s.emit('onLazyImageReady', s, slide[0], _img[0]);\n                    });\n        \n                    s.emit('onLazyImageLoad', s, slide[0], _img[0]);\n                });\n        \n            },\n            load: function () {\n                var i;\n                var slidesPerView = s.params.slidesPerView;\n                if (slidesPerView === 'auto') {\n                    slidesPerView = 0;\n                }\n                if (!s.lazy.initialImageLoaded) s.lazy.initialImageLoaded = true;\n                if (s.params.watchSlidesVisibility) {\n                    s.wrapper.children('.' + s.params.slideVisibleClass).each(function () {\n                        s.lazy.loadImageInSlide($(this).index());\n                    });\n                }\n                else {\n                    if (slidesPerView > 1) {\n                        for (i = s.activeIndex; i < s.activeIndex + slidesPerView ; i++) {\n                            if (s.slides[i]) s.lazy.loadImageInSlide(i);\n                        }\n                    }\n                    else {\n                        s.lazy.loadImageInSlide(s.activeIndex);\n                    }\n                }\n                if (s.params.lazyLoadingInPrevNext) {\n                    if (slidesPerView > 1 || (s.params.lazyLoadingInPrevNextAmount && s.params.lazyLoadingInPrevNextAmount > 1)) {\n                        var amount = s.params.lazyLoadingInPrevNextAmount;\n                        var spv = slidesPerView;\n                        var maxIndex = Math.min(s.activeIndex + spv + Math.max(amount, spv), s.slides.length);\n                        var minIndex = Math.max(s.activeIndex - Math.max(spv, amount), 0);\n                        // Next Slides\n                        for (i = s.activeIndex + slidesPerView; i < maxIndex; i++) {\n                            if (s.slides[i]) s.lazy.loadImageInSlide(i);\n                        }\n                        // Prev Slides\n                        for (i = minIndex; i < s.activeIndex ; i++) {\n                            if (s.slides[i]) s.lazy.loadImageInSlide(i);\n                        }\n                    }\n                    else {\n                        var nextSlide = s.wrapper.children('.' + s.params.slideNextClass);\n                        if (nextSlide.length > 0) s.lazy.loadImageInSlide(nextSlide.index());\n        \n                        var prevSlide = s.wrapper.children('.' + s.params.slidePrevClass);\n                        if (prevSlide.length > 0) s.lazy.loadImageInSlide(prevSlide.index());\n                    }\n                }\n            },\n            onTransitionStart: function () {\n                if (s.params.lazyLoading) {\n                    if (s.params.lazyLoadingOnTransitionStart || (!s.params.lazyLoadingOnTransitionStart && !s.lazy.initialImageLoaded)) {\n                        s.lazy.load();\n                    }\n                }\n            },\n            onTransitionEnd: function () {\n                if (s.params.lazyLoading && !s.params.lazyLoadingOnTransitionStart) {\n                    s.lazy.load();\n                }\n            }\n        };\n        \n    \n        /*=========================\n          Scrollbar\n          ===========================*/\n        s.scrollbar = {\n            isTouched: false,\n            setDragPosition: function (e) {\n                var sb = s.scrollbar;\n                var x = 0, y = 0;\n                var translate;\n                var pointerPosition = s.isHorizontal() ?\n                    ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageX : e.pageX || e.clientX) :\n                    ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].pageY : e.pageY || e.clientY) ;\n                var position = (pointerPosition) - sb.track.offset()[s.isHorizontal() ? 'left' : 'top'] - sb.dragSize / 2;\n                var positionMin = -s.minTranslate() * sb.moveDivider;\n                var positionMax = -s.maxTranslate() * sb.moveDivider;\n                if (position < positionMin) {\n                    position = positionMin;\n                }\n                else if (position > positionMax) {\n                    position = positionMax;\n                }\n                position = -position / sb.moveDivider;\n                s.updateProgress(position);\n                s.setWrapperTranslate(position, true);\n            },\n            dragStart: function (e) {\n                var sb = s.scrollbar;\n                sb.isTouched = true;\n                e.preventDefault();\n                e.stopPropagation();\n        \n                sb.setDragPosition(e);\n                clearTimeout(sb.dragTimeout);\n        \n                sb.track.transition(0);\n                if (s.params.scrollbarHide) {\n                    sb.track.css('opacity', 1);\n                }\n                s.wrapper.transition(100);\n                sb.drag.transition(100);\n                s.emit('onScrollbarDragStart', s);\n            },\n            dragMove: function (e) {\n                var sb = s.scrollbar;\n                if (!sb.isTouched) return;\n                if (e.preventDefault) e.preventDefault();\n                else e.returnValue = false;\n                sb.setDragPosition(e);\n                s.wrapper.transition(0);\n                sb.track.transition(0);\n                sb.drag.transition(0);\n                s.emit('onScrollbarDragMove', s);\n            },\n            dragEnd: function (e) {\n                var sb = s.scrollbar;\n                if (!sb.isTouched) return;\n                sb.isTouched = false;\n                if (s.params.scrollbarHide) {\n                    clearTimeout(sb.dragTimeout);\n                    sb.dragTimeout = setTimeout(function () {\n                        sb.track.css('opacity', 0);\n                        sb.track.transition(400);\n                    }, 1000);\n        \n                }\n                s.emit('onScrollbarDragEnd', s);\n                if (s.params.scrollbarSnapOnRelease) {\n                    s.slideReset();\n                }\n            },\n            draggableEvents: (function () {\n                if ((s.params.simulateTouch === false && !s.support.touch)) return s.touchEventsDesktop;\n                else return s.touchEvents;\n            })(),\n            enableDraggable: function () {\n                var sb = s.scrollbar;\n                var target = s.support.touch ? sb.track : document;\n                $(sb.track).on(sb.draggableEvents.start, sb.dragStart);\n                $(target).on(sb.draggableEvents.move, sb.dragMove);\n                $(target).on(sb.draggableEvents.end, sb.dragEnd);\n            },\n            disableDraggable: function () {\n                var sb = s.scrollbar;\n                var target = s.support.touch ? sb.track : document;\n                $(sb.track).off(s.draggableEvents.start, sb.dragStart);\n                $(target).off(s.draggableEvents.move, sb.dragMove);\n                $(target).off(s.draggableEvents.end, sb.dragEnd);\n            },\n            set: function () {\n                if (!s.params.scrollbar) return;\n                var sb = s.scrollbar;\n                sb.track = $(s.params.scrollbar);\n                if (s.params.uniqueNavElements && typeof s.params.scrollbar === 'string' && sb.track.length > 1 && s.container.find(s.params.scrollbar).length === 1) {\n                    sb.track = s.container.find(s.params.scrollbar);\n                }\n                sb.drag = sb.track.find('.swiper-scrollbar-drag');\n                if (sb.drag.length === 0) {\n                    sb.drag = $('<div class=\"swiper-scrollbar-drag\"></div>');\n                    sb.track.append(sb.drag);\n                }\n                sb.drag[0].style.width = '';\n                sb.drag[0].style.height = '';\n                sb.trackSize = s.isHorizontal() ? sb.track[0].offsetWidth : sb.track[0].offsetHeight;\n        \n                sb.divider = s.size / s.virtualSize;\n                sb.moveDivider = sb.divider * (sb.trackSize / s.size);\n                sb.dragSize = sb.trackSize * sb.divider;\n        \n                if (s.isHorizontal()) {\n                    sb.drag[0].style.width = sb.dragSize + 'px';\n                }\n                else {\n                    sb.drag[0].style.height = sb.dragSize + 'px';\n                }\n        \n                if (sb.divider >= 1) {\n                    sb.track[0].style.display = 'none';\n                }\n                else {\n                    sb.track[0].style.display = '';\n                }\n                if (s.params.scrollbarHide) {\n                    sb.track[0].style.opacity = 0;\n                }\n            },\n            setTranslate: function () {\n                if (!s.params.scrollbar) return;\n                var diff;\n                var sb = s.scrollbar;\n                var translate = s.translate || 0;\n                var newPos;\n        \n                var newSize = sb.dragSize;\n                newPos = (sb.trackSize - sb.dragSize) * s.progress;\n                if (s.rtl && s.isHorizontal()) {\n                    newPos = -newPos;\n                    if (newPos > 0) {\n                        newSize = sb.dragSize - newPos;\n                        newPos = 0;\n                    }\n                    else if (-newPos + sb.dragSize > sb.trackSize) {\n                        newSize = sb.trackSize + newPos;\n                    }\n                }\n                else {\n                    if (newPos < 0) {\n                        newSize = sb.dragSize + newPos;\n                        newPos = 0;\n                    }\n                    else if (newPos + sb.dragSize > sb.trackSize) {\n                        newSize = sb.trackSize - newPos;\n                    }\n                }\n                if (s.isHorizontal()) {\n                    if (s.support.transforms3d) {\n                        sb.drag.transform('translate3d(' + (newPos) + 'px, 0, 0)');\n                    }\n                    else {\n                        sb.drag.transform('translateX(' + (newPos) + 'px)');\n                    }\n                    sb.drag[0].style.width = newSize + 'px';\n                }\n                else {\n                    if (s.support.transforms3d) {\n                        sb.drag.transform('translate3d(0px, ' + (newPos) + 'px, 0)');\n                    }\n                    else {\n                        sb.drag.transform('translateY(' + (newPos) + 'px)');\n                    }\n                    sb.drag[0].style.height = newSize + 'px';\n                }\n                if (s.params.scrollbarHide) {\n                    clearTimeout(sb.timeout);\n                    sb.track[0].style.opacity = 1;\n                    sb.timeout = setTimeout(function () {\n                        sb.track[0].style.opacity = 0;\n                        sb.track.transition(400);\n                    }, 1000);\n                }\n            },\n            setTransition: function (duration) {\n                if (!s.params.scrollbar) return;\n                s.scrollbar.drag.transition(duration);\n            }\n        };\n    \n        /*=========================\n          Controller\n          ===========================*/\n        s.controller = {\n            LinearSpline: function (x, y) {\n                this.x = x;\n                this.y = y;\n                this.lastIndex = x.length - 1;\n                // Given an x value (x2), return the expected y2 value:\n                // (x1,y1) is the known point before given value,\n                // (x3,y3) is the known point after given value.\n                var i1, i3;\n                var l = this.x.length;\n        \n                this.interpolate = function (x2) {\n                    if (!x2) return 0;\n        \n                    // Get the indexes of x1 and x3 (the array indexes before and after given x2):\n                    i3 = binarySearch(this.x, x2);\n                    i1 = i3 - 1;\n        \n                    // We have our indexes i1 & i3, so we can calculate already:\n                    // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1\n                    return ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1]) + this.y[i1];\n                };\n        \n                var binarySearch = (function() {\n                    var maxIndex, minIndex, guess;\n                    return function(array, val) {\n                        minIndex = -1;\n                        maxIndex = array.length;\n                        while (maxIndex - minIndex > 1)\n                            if (array[guess = maxIndex + minIndex >> 1] <= val) {\n                                minIndex = guess;\n                            } else {\n                                maxIndex = guess;\n                            }\n                        return maxIndex;\n                    };\n                })();\n            },\n            //xxx: for now i will just save one spline function to to\n            getInterpolateFunction: function(c){\n                if(!s.controller.spline) s.controller.spline = s.params.loop ?\n                    new s.controller.LinearSpline(s.slidesGrid, c.slidesGrid) :\n                    new s.controller.LinearSpline(s.snapGrid, c.snapGrid);\n            },\n            setTranslate: function (translate, byController) {\n               var controlled = s.params.control;\n               var multiplier, controlledTranslate;\n               function setControlledTranslate(c) {\n                    // this will create an Interpolate function based on the snapGrids\n                    // x is the Grid of the scrolled scroller and y will be the controlled scroller\n                    // it makes sense to create this only once and recall it for the interpolation\n                    // the function does a lot of value caching for performance\n                    translate = c.rtl && c.params.direction === 'horizontal' ? -s.translate : s.translate;\n                    if (s.params.controlBy === 'slide') {\n                        s.controller.getInterpolateFunction(c);\n                        // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid\n                        // but it did not work out\n                        controlledTranslate = -s.controller.spline.interpolate(-translate);\n                    }\n        \n                    if(!controlledTranslate || s.params.controlBy === 'container'){\n                        multiplier = (c.maxTranslate() - c.minTranslate()) / (s.maxTranslate() - s.minTranslate());\n                        controlledTranslate = (translate - s.minTranslate()) * multiplier + c.minTranslate();\n                    }\n        \n                    if (s.params.controlInverse) {\n                        controlledTranslate = c.maxTranslate() - controlledTranslate;\n                    }\n                    c.updateProgress(controlledTranslate);\n                    c.setWrapperTranslate(controlledTranslate, false, s);\n                    c.updateActiveIndex();\n               }\n               if (s.isArray(controlled)) {\n                   for (var i = 0; i < controlled.length; i++) {\n                       if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n                           setControlledTranslate(controlled[i]);\n                       }\n                   }\n               }\n               else if (controlled instanceof Swiper && byController !== controlled) {\n        \n                   setControlledTranslate(controlled);\n               }\n            },\n            setTransition: function (duration, byController) {\n                var controlled = s.params.control;\n                var i;\n                function setControlledTransition(c) {\n                    c.setWrapperTransition(duration, s);\n                    if (duration !== 0) {\n                        c.onTransitionStart();\n                        c.wrapper.transitionEnd(function(){\n                            if (!controlled) return;\n                            if (c.params.loop && s.params.controlBy === 'slide') {\n                                c.fixLoop();\n                            }\n                            c.onTransitionEnd();\n        \n                        });\n                    }\n                }\n                if (s.isArray(controlled)) {\n                    for (i = 0; i < controlled.length; i++) {\n                        if (controlled[i] !== byController && controlled[i] instanceof Swiper) {\n                            setControlledTransition(controlled[i]);\n                        }\n                    }\n                }\n                else if (controlled instanceof Swiper && byController !== controlled) {\n                    setControlledTransition(controlled);\n                }\n            }\n        };\n    \n        /*=========================\n          Parallax\n          ===========================*/\n        function setParallaxTransform(el, progress) {\n            el = $(el);\n            var p, pX, pY;\n            var rtlFactor = s.rtl ? -1 : 1;\n        \n            p = el.attr('data-swiper-parallax') || '0';\n            pX = el.attr('data-swiper-parallax-x');\n            pY = el.attr('data-swiper-parallax-y');\n            if (pX || pY) {\n                pX = pX || '0';\n                pY = pY || '0';\n            }\n            else {\n                if (s.isHorizontal()) {\n                    pX = p;\n                    pY = '0';\n                }\n                else {\n                    pY = p;\n                    pX = '0';\n                }\n            }\n        \n            if ((pX).indexOf('%') >= 0) {\n                pX = parseInt(pX, 10) * progress * rtlFactor + '%';\n            }\n            else {\n                pX = pX * progress * rtlFactor + 'px' ;\n            }\n            if ((pY).indexOf('%') >= 0) {\n                pY = parseInt(pY, 10) * progress + '%';\n            }\n            else {\n                pY = pY * progress + 'px' ;\n            }\n        \n            el.transform('translate3d(' + pX + ', ' + pY + ',0px)');\n        }\n        s.parallax = {\n            setTranslate: function () {\n                s.container.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){\n                    setParallaxTransform(this, s.progress);\n        \n                });\n                s.slides.each(function () {\n                    var slide = $(this);\n                    slide.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function () {\n                        var progress = Math.min(Math.max(slide[0].progress, -1), 1);\n                        setParallaxTransform(this, progress);\n                    });\n                });\n            },\n            setTransition: function (duration) {\n                if (typeof duration === 'undefined') duration = s.params.speed;\n                s.container.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]').each(function(){\n                    var el = $(this);\n                    var parallaxDuration = parseInt(el.attr('data-swiper-parallax-duration'), 10) || duration;\n                    if (duration === 0) parallaxDuration = 0;\n                    el.transition(parallaxDuration);\n                });\n            }\n        };\n        \n    \n        /*=========================\n          Zoom\n          ===========================*/\n        s.zoom = {\n            // \"Global\" Props\n            scale: 1,\n            currentScale: 1,\n            isScaling: false,\n            gesture: {\n                slide: undefined,\n                slideWidth: undefined,\n                slideHeight: undefined,\n                image: undefined,\n                imageWrap: undefined,\n                zoomMax: s.params.zoomMax\n            },\n            image: {\n                isTouched: undefined,\n                isMoved: undefined,\n                currentX: undefined,\n                currentY: undefined,\n                minX: undefined,\n                minY: undefined,\n                maxX: undefined,\n                maxY: undefined,\n                width: undefined,\n                height: undefined,\n                startX: undefined,\n                startY: undefined,\n                touchesStart: {},\n                touchesCurrent: {}\n            },\n            velocity: {\n                x: undefined,\n                y: undefined,\n                prevPositionX: undefined,\n                prevPositionY: undefined,\n                prevTime: undefined\n            },\n            // Calc Scale From Multi-touches\n            getDistanceBetweenTouches: function (e) {\n                if (e.targetTouches.length < 2) return 1;\n                var x1 = e.targetTouches[0].pageX,\n                    y1 = e.targetTouches[0].pageY,\n                    x2 = e.targetTouches[1].pageX,\n                    y2 = e.targetTouches[1].pageY;\n                var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n                return distance;\n            },\n            // Events\n            onGestureStart: function (e) {\n                var z = s.zoom;\n                if (!s.support.gestures) {\n                    if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) {\n                        return;\n                    }\n                    z.gesture.scaleStart = z.getDistanceBetweenTouches(e);\n                }\n                if (!z.gesture.slide || !z.gesture.slide.length) {\n                    z.gesture.slide = $(this);\n                    if (z.gesture.slide.length === 0) z.gesture.slide = s.slides.eq(s.activeIndex);\n                    z.gesture.image = z.gesture.slide.find('img, svg, canvas');\n                    z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass);\n                    z.gesture.zoomMax = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax ;\n                    if (z.gesture.imageWrap.length === 0) {\n                        z.gesture.image = undefined;\n                        return;\n                    }\n                }\n                z.gesture.image.transition(0);\n                z.isScaling = true;\n            },\n            onGestureChange: function (e) {\n                var z = s.zoom;\n                if (!s.support.gestures) {\n                    if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) {\n                        return;\n                    }\n                    z.gesture.scaleMove = z.getDistanceBetweenTouches(e);\n                }\n                if (!z.gesture.image || z.gesture.image.length === 0) return;\n                if (s.support.gestures) {\n                    z.scale = e.scale * z.currentScale;\n                }\n                else {\n                    z.scale = (z.gesture.scaleMove / z.gesture.scaleStart) * z.currentScale;\n                }\n                if (z.scale > z.gesture.zoomMax) {\n                    z.scale = z.gesture.zoomMax - 1 + Math.pow((z.scale - z.gesture.zoomMax + 1), 0.5);\n                }\n                if (z.scale < s.params.zoomMin) {\n                    z.scale =  s.params.zoomMin + 1 - Math.pow((s.params.zoomMin - z.scale + 1), 0.5);\n                }\n                z.gesture.image.transform('translate3d(0,0,0) scale(' + z.scale + ')');\n            },\n            onGestureEnd: function (e) {\n                var z = s.zoom;\n                if (!s.support.gestures) {\n                    if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2) {\n                        return;\n                    }\n                }\n                if (!z.gesture.image || z.gesture.image.length === 0) return;\n                z.scale = Math.max(Math.min(z.scale, z.gesture.zoomMax), s.params.zoomMin);\n                z.gesture.image.transition(s.params.speed).transform('translate3d(0,0,0) scale(' + z.scale + ')');\n                z.currentScale = z.scale;\n                z.isScaling = false;\n                if (z.scale === 1) z.gesture.slide = undefined;\n            },\n            onTouchStart: function (s, e) {\n                var z = s.zoom;\n                if (!z.gesture.image || z.gesture.image.length === 0) return;\n                if (z.image.isTouched) return;\n                if (s.device.os === 'android') e.preventDefault();\n                z.image.isTouched = true;\n                z.image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n                z.image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n            },\n            onTouchMove: function (e) {\n                var z = s.zoom;\n                if (!z.gesture.image || z.gesture.image.length === 0) return;\n                s.allowClick = false;\n                if (!z.image.isTouched || !z.gesture.slide) return;\n        \n                if (!z.image.isMoved) {\n                    z.image.width = z.gesture.image[0].offsetWidth;\n                    z.image.height = z.gesture.image[0].offsetHeight;\n                    z.image.startX = s.getTranslate(z.gesture.imageWrap[0], 'x') || 0;\n                    z.image.startY = s.getTranslate(z.gesture.imageWrap[0], 'y') || 0;\n                    z.gesture.slideWidth = z.gesture.slide[0].offsetWidth;\n                    z.gesture.slideHeight = z.gesture.slide[0].offsetHeight;\n                    z.gesture.imageWrap.transition(0);\n                }\n                // Define if we need image drag\n                var scaledWidth = z.image.width * z.scale;\n                var scaledHeight = z.image.height * z.scale;\n        \n                if (scaledWidth < z.gesture.slideWidth && scaledHeight < z.gesture.slideHeight) return;\n        \n                z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0);\n                z.image.maxX = -z.image.minX;\n                z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0);\n                z.image.maxY = -z.image.minY;\n        \n                z.image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;\n                z.image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;\n        \n                if (!z.image.isMoved && !z.isScaling) {\n                    if (s.isHorizontal() &&\n                        (Math.floor(z.image.minX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x < z.image.touchesStart.x) ||\n                        (Math.floor(z.image.maxX) === Math.floor(z.image.startX) && z.image.touchesCurrent.x > z.image.touchesStart.x)\n                        ) {\n                        z.image.isTouched = false;\n                        return;\n                    }\n                    else if (!s.isHorizontal() &&\n                        (Math.floor(z.image.minY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y < z.image.touchesStart.y) ||\n                        (Math.floor(z.image.maxY) === Math.floor(z.image.startY) && z.image.touchesCurrent.y > z.image.touchesStart.y)\n                        ) {\n                        z.image.isTouched = false;\n                        return;\n                    }\n                }\n                e.preventDefault();\n                e.stopPropagation();\n        \n                z.image.isMoved = true;\n                z.image.currentX = z.image.touchesCurrent.x - z.image.touchesStart.x + z.image.startX;\n                z.image.currentY = z.image.touchesCurrent.y - z.image.touchesStart.y + z.image.startY;\n        \n                if (z.image.currentX < z.image.minX) {\n                    z.image.currentX =  z.image.minX + 1 - Math.pow((z.image.minX - z.image.currentX + 1), 0.8);\n                }\n                if (z.image.currentX > z.image.maxX) {\n                    z.image.currentX = z.image.maxX - 1 + Math.pow((z.image.currentX - z.image.maxX + 1), 0.8);\n                }\n        \n                if (z.image.currentY < z.image.minY) {\n                    z.image.currentY =  z.image.minY + 1 - Math.pow((z.image.minY - z.image.currentY + 1), 0.8);\n                }\n                if (z.image.currentY > z.image.maxY) {\n                    z.image.currentY = z.image.maxY - 1 + Math.pow((z.image.currentY - z.image.maxY + 1), 0.8);\n                }\n        \n                //Velocity\n                if (!z.velocity.prevPositionX) z.velocity.prevPositionX = z.image.touchesCurrent.x;\n                if (!z.velocity.prevPositionY) z.velocity.prevPositionY = z.image.touchesCurrent.y;\n                if (!z.velocity.prevTime) z.velocity.prevTime = Date.now();\n                z.velocity.x = (z.image.touchesCurrent.x - z.velocity.prevPositionX) / (Date.now() - z.velocity.prevTime) / 2;\n                z.velocity.y = (z.image.touchesCurrent.y - z.velocity.prevPositionY) / (Date.now() - z.velocity.prevTime) / 2;\n                if (Math.abs(z.image.touchesCurrent.x - z.velocity.prevPositionX) < 2) z.velocity.x = 0;\n                if (Math.abs(z.image.touchesCurrent.y - z.velocity.prevPositionY) < 2) z.velocity.y = 0;\n                z.velocity.prevPositionX = z.image.touchesCurrent.x;\n                z.velocity.prevPositionY = z.image.touchesCurrent.y;\n                z.velocity.prevTime = Date.now();\n        \n                z.gesture.imageWrap.transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)');\n            },\n            onTouchEnd: function (s, e) {\n                var z = s.zoom;\n                if (!z.gesture.image || z.gesture.image.length === 0) return;\n                if (!z.image.isTouched || !z.image.isMoved) {\n                    z.image.isTouched = false;\n                    z.image.isMoved = false;\n                    return;\n                }\n                z.image.isTouched = false;\n                z.image.isMoved = false;\n                var momentumDurationX = 300;\n                var momentumDurationY = 300;\n                var momentumDistanceX = z.velocity.x * momentumDurationX;\n                var newPositionX = z.image.currentX + momentumDistanceX;\n                var momentumDistanceY = z.velocity.y * momentumDurationY;\n                var newPositionY = z.image.currentY + momentumDistanceY;\n        \n                //Fix duration\n                if (z.velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - z.image.currentX) / z.velocity.x);\n                if (z.velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - z.image.currentY) / z.velocity.y);\n                var momentumDuration = Math.max(momentumDurationX, momentumDurationY);\n        \n                z.image.currentX = newPositionX;\n                z.image.currentY = newPositionY;\n        \n                // Define if we need image drag\n                var scaledWidth = z.image.width * z.scale;\n                var scaledHeight = z.image.height * z.scale;\n                z.image.minX = Math.min((z.gesture.slideWidth / 2 - scaledWidth / 2), 0);\n                z.image.maxX = -z.image.minX;\n                z.image.minY = Math.min((z.gesture.slideHeight / 2 - scaledHeight / 2), 0);\n                z.image.maxY = -z.image.minY;\n                z.image.currentX = Math.max(Math.min(z.image.currentX, z.image.maxX), z.image.minX);\n                z.image.currentY = Math.max(Math.min(z.image.currentY, z.image.maxY), z.image.minY);\n        \n                z.gesture.imageWrap.transition(momentumDuration).transform('translate3d(' + z.image.currentX + 'px, ' + z.image.currentY + 'px,0)');\n            },\n            onTransitionEnd: function (s) {\n                var z = s.zoom;\n                if (z.gesture.slide && s.previousIndex !== s.activeIndex) {\n                    z.gesture.image.transform('translate3d(0,0,0) scale(1)');\n                    z.gesture.imageWrap.transform('translate3d(0,0,0)');\n                    z.gesture.slide = z.gesture.image = z.gesture.imageWrap = undefined;\n                    z.scale = z.currentScale = 1;\n                }\n            },\n            // Toggle Zoom\n            toggleZoom: function (s, e) {\n                var z = s.zoom;\n                if (!z.gesture.slide) {\n                    z.gesture.slide = s.clickedSlide ? $(s.clickedSlide) : s.slides.eq(s.activeIndex);\n                    z.gesture.image = z.gesture.slide.find('img, svg, canvas');\n                    z.gesture.imageWrap = z.gesture.image.parent('.' + s.params.zoomContainerClass);\n                }\n                if (!z.gesture.image || z.gesture.image.length === 0) return;\n        \n                var touchX, touchY, offsetX, offsetY, diffX, diffY, translateX, translateY, imageWidth, imageHeight, scaledWidth, scaledHeight, translateMinX, translateMinY, translateMaxX, translateMaxY, slideWidth, slideHeight;\n        \n                if (typeof z.image.touchesStart.x === 'undefined' && e) {\n                    touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;\n                    touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;\n                }\n                else {\n                    touchX = z.image.touchesStart.x;\n                    touchY = z.image.touchesStart.y;\n                }\n        \n                if (z.scale && z.scale !== 1) {\n                    // Zoom Out\n                    z.scale = z.currentScale = 1;\n                    z.gesture.imageWrap.transition(300).transform('translate3d(0,0,0)');\n                    z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(1)');\n                    z.gesture.slide = undefined;\n                }\n                else {\n                    // Zoom In\n                    z.scale = z.currentScale = z.gesture.imageWrap.attr('data-swiper-zoom') || s.params.zoomMax;\n                    if (e) {\n                        slideWidth = z.gesture.slide[0].offsetWidth;\n                        slideHeight = z.gesture.slide[0].offsetHeight;\n                        offsetX = z.gesture.slide.offset().left;\n                        offsetY = z.gesture.slide.offset().top;\n                        diffX = offsetX + slideWidth/2 - touchX;\n                        diffY = offsetY + slideHeight/2 - touchY;\n        \n                        imageWidth = z.gesture.image[0].offsetWidth;\n                        imageHeight = z.gesture.image[0].offsetHeight;\n                        scaledWidth = imageWidth * z.scale;\n                        scaledHeight = imageHeight * z.scale;\n        \n                        translateMinX = Math.min((slideWidth / 2 - scaledWidth / 2), 0);\n                        translateMinY = Math.min((slideHeight / 2 - scaledHeight / 2), 0);\n                        translateMaxX = -translateMinX;\n                        translateMaxY = -translateMinY;\n        \n                        translateX = diffX * z.scale;\n                        translateY = diffY * z.scale;\n        \n                        if (translateX < translateMinX) {\n                            translateX =  translateMinX;\n                        }\n                        if (translateX > translateMaxX) {\n                            translateX = translateMaxX;\n                        }\n        \n                        if (translateY < translateMinY) {\n                            translateY =  translateMinY;\n                        }\n                        if (translateY > translateMaxY) {\n                            translateY = translateMaxY;\n                        }\n                    }\n                    else {\n                        translateX = 0;\n                        translateY = 0;\n                    }\n                    z.gesture.imageWrap.transition(300).transform('translate3d(' + translateX + 'px, ' + translateY + 'px,0)');\n                    z.gesture.image.transition(300).transform('translate3d(0,0,0) scale(' + z.scale + ')');\n                }\n            },\n            // Attach/Detach Events\n            attachEvents: function (detach) {\n                var action = detach ? 'off' : 'on';\n        \n                if (s.params.zoom) {\n                    var target = s.slides;\n                    var passiveListener = s.touchEvents.start === 'touchstart' && s.support.passiveListener && s.params.passiveListeners ? {passive: true, capture: false} : false;\n                    // Scale image\n                    if (s.support.gestures) {\n                        s.slides[action]('gesturestart', s.zoom.onGestureStart, passiveListener);\n                        s.slides[action]('gesturechange', s.zoom.onGestureChange, passiveListener);\n                        s.slides[action]('gestureend', s.zoom.onGestureEnd, passiveListener);\n                    }\n                    else if (s.touchEvents.start === 'touchstart') {\n                        s.slides[action](s.touchEvents.start, s.zoom.onGestureStart, passiveListener);\n                        s.slides[action](s.touchEvents.move, s.zoom.onGestureChange, passiveListener);\n                        s.slides[action](s.touchEvents.end, s.zoom.onGestureEnd, passiveListener);\n                    }\n        \n                    // Move image\n                    s[action]('touchStart', s.zoom.onTouchStart);\n                    s.slides.each(function (index, slide){\n                        if ($(slide).find('.' + s.params.zoomContainerClass).length > 0) {\n                            $(slide)[action](s.touchEvents.move, s.zoom.onTouchMove);\n                        }\n                    });\n                    s[action]('touchEnd', s.zoom.onTouchEnd);\n        \n                    // Scale Out\n                    s[action]('transitionEnd', s.zoom.onTransitionEnd);\n                    if (s.params.zoomToggle) {\n                        s.on('doubleTap', s.zoom.toggleZoom);\n                    }\n                }\n            },\n            init: function () {\n                s.zoom.attachEvents();\n            },\n            destroy: function () {\n                s.zoom.attachEvents(true);\n            }\n        };\n    \n        /*=========================\n          Plugins API. Collect all and init all plugins\n          ===========================*/\n        s._plugins = [];\n        for (var plugin in s.plugins) {\n            var p = s.plugins[plugin](s, s.params[plugin]);\n            if (p) s._plugins.push(p);\n        }\n        // Method to call all plugins event/method\n        s.callPlugins = function (eventName) {\n            for (var i = 0; i < s._plugins.length; i++) {\n                if (eventName in s._plugins[i]) {\n                    s._plugins[i][eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);\n                }\n            }\n        };\n    \n        /*=========================\n          Events/Callbacks/Plugins Emitter\n          ===========================*/\n        function normalizeEventName (eventName) {\n            if (eventName.indexOf('on') !== 0) {\n                if (eventName[0] !== eventName[0].toUpperCase()) {\n                    eventName = 'on' + eventName[0].toUpperCase() + eventName.substring(1);\n                }\n                else {\n                    eventName = 'on' + eventName;\n                }\n            }\n            return eventName;\n        }\n        s.emitterEventListeners = {\n        \n        };\n        s.emit = function (eventName) {\n            // Trigger callbacks\n            if (s.params[eventName]) {\n                s.params[eventName](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);\n            }\n            var i;\n            // Trigger events\n            if (s.emitterEventListeners[eventName]) {\n                for (i = 0; i < s.emitterEventListeners[eventName].length; i++) {\n                    s.emitterEventListeners[eventName][i](arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);\n                }\n            }\n            // Trigger plugins\n            if (s.callPlugins) s.callPlugins(eventName, arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);\n        };\n        s.on = function (eventName, handler) {\n            eventName = normalizeEventName(eventName);\n            if (!s.emitterEventListeners[eventName]) s.emitterEventListeners[eventName] = [];\n            s.emitterEventListeners[eventName].push(handler);\n            return s;\n        };\n        s.off = function (eventName, handler) {\n            var i;\n            eventName = normalizeEventName(eventName);\n            if (typeof handler === 'undefined') {\n                // Remove all handlers for such event\n                s.emitterEventListeners[eventName] = [];\n                return s;\n            }\n            if (!s.emitterEventListeners[eventName] || s.emitterEventListeners[eventName].length === 0) return;\n            for (i = 0; i < s.emitterEventListeners[eventName].length; i++) {\n                if(s.emitterEventListeners[eventName][i] === handler) s.emitterEventListeners[eventName].splice(i, 1);\n            }\n            return s;\n        };\n        s.once = function (eventName, handler) {\n            eventName = normalizeEventName(eventName);\n            var _handler = function () {\n                handler(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);\n                s.off(eventName, _handler);\n            };\n            s.on(eventName, _handler);\n            return s;\n        };\n    \n        // Accessibility tools\n        s.a11y = {\n            makeFocusable: function ($el) {\n                $el.attr('tabIndex', '0');\n                return $el;\n            },\n            addRole: function ($el, role) {\n                $el.attr('role', role);\n                return $el;\n            },\n        \n            addLabel: function ($el, label) {\n                $el.attr('aria-label', label);\n                return $el;\n            },\n        \n            disable: function ($el) {\n                $el.attr('aria-disabled', true);\n                return $el;\n            },\n        \n            enable: function ($el) {\n                $el.attr('aria-disabled', false);\n                return $el;\n            },\n        \n            onEnterKey: function (event) {\n                if (event.keyCode !== 13) return;\n                if ($(event.target).is(s.params.nextButton)) {\n                    s.onClickNext(event);\n                    if (s.isEnd) {\n                        s.a11y.notify(s.params.lastSlideMessage);\n                    }\n                    else {\n                        s.a11y.notify(s.params.nextSlideMessage);\n                    }\n                }\n                else if ($(event.target).is(s.params.prevButton)) {\n                    s.onClickPrev(event);\n                    if (s.isBeginning) {\n                        s.a11y.notify(s.params.firstSlideMessage);\n                    }\n                    else {\n                        s.a11y.notify(s.params.prevSlideMessage);\n                    }\n                }\n                if ($(event.target).is('.' + s.params.bulletClass)) {\n                    $(event.target)[0].click();\n                }\n            },\n        \n            liveRegion: $('<span class=\"' + s.params.notificationClass + '\" aria-live=\"assertive\" aria-atomic=\"true\"></span>'),\n        \n            notify: function (message) {\n                var notification = s.a11y.liveRegion;\n                if (notification.length === 0) return;\n                notification.html('');\n                notification.html(message);\n            },\n            init: function () {\n                // Setup accessibility\n                if (s.params.nextButton && s.nextButton && s.nextButton.length > 0) {\n                    s.a11y.makeFocusable(s.nextButton);\n                    s.a11y.addRole(s.nextButton, 'button');\n                    s.a11y.addLabel(s.nextButton, s.params.nextSlideMessage);\n                }\n                if (s.params.prevButton && s.prevButton && s.prevButton.length > 0) {\n                    s.a11y.makeFocusable(s.prevButton);\n                    s.a11y.addRole(s.prevButton, 'button');\n                    s.a11y.addLabel(s.prevButton, s.params.prevSlideMessage);\n                }\n        \n                $(s.container).append(s.a11y.liveRegion);\n            },\n            initPagination: function () {\n                if (s.params.pagination && s.params.paginationClickable && s.bullets && s.bullets.length) {\n                    s.bullets.each(function () {\n                        var bullet = $(this);\n                        s.a11y.makeFocusable(bullet);\n                        s.a11y.addRole(bullet, 'button');\n                        s.a11y.addLabel(bullet, s.params.paginationBulletMessage.replace(/{{index}}/, bullet.index() + 1));\n                    });\n                }\n            },\n            destroy: function () {\n                if (s.a11y.liveRegion && s.a11y.liveRegion.length > 0) s.a11y.liveRegion.remove();\n            }\n        };\n        \n    \n        /*=========================\n          Init/Destroy\n          ===========================*/\n        s.init = function () {\n            if (s.params.loop) s.createLoop();\n            s.updateContainerSize();\n            s.updateSlidesSize();\n            s.updatePagination();\n            if (s.params.scrollbar && s.scrollbar) {\n                s.scrollbar.set();\n                if (s.params.scrollbarDraggable) {\n                    s.scrollbar.enableDraggable();\n                }\n            }\n            if (s.params.effect !== 'slide' && s.effects[s.params.effect]) {\n                if (!s.params.loop) s.updateProgress();\n                s.effects[s.params.effect].setTranslate();\n            }\n            if (s.params.loop) {\n                s.slideTo(s.params.initialSlide + s.loopedSlides, 0, s.params.runCallbacksOnInit);\n            }\n            else {\n                s.slideTo(s.params.initialSlide, 0, s.params.runCallbacksOnInit);\n                if (s.params.initialSlide === 0) {\n                    if (s.parallax && s.params.parallax) s.parallax.setTranslate();\n                    if (s.lazy && s.params.lazyLoading) {\n                        s.lazy.load();\n                        s.lazy.initialImageLoaded = true;\n                    }\n                }\n            }\n            s.attachEvents();\n            if (s.params.observer && s.support.observer) {\n                s.initObservers();\n            }\n            if (s.params.preloadImages && !s.params.lazyLoading) {\n                s.preloadImages();\n            }\n            if (s.params.zoom && s.zoom) {\n                s.zoom.init();\n            }\n            if (s.params.autoplay) {\n                s.startAutoplay();\n            }\n            if (s.params.keyboardControl) {\n                if (s.enableKeyboardControl) s.enableKeyboardControl();\n            }\n            if (s.params.mousewheelControl) {\n                if (s.enableMousewheelControl) s.enableMousewheelControl();\n            }\n            // Deprecated hashnavReplaceState changed to replaceState for use in hashnav and history\n            if (s.params.hashnavReplaceState) {\n                s.params.replaceState = s.params.hashnavReplaceState;\n            }\n            if (s.params.history) {\n                if (s.history) s.history.init();\n            }\n            if (s.params.hashnav) {\n                if (s.hashnav) s.hashnav.init();\n            }\n            if (s.params.a11y && s.a11y) s.a11y.init();\n            s.emit('onInit', s);\n        };\n        \n        // Cleanup dynamic styles\n        s.cleanupStyles = function () {\n            // Container\n            s.container.removeClass(s.classNames.join(' ')).removeAttr('style');\n        \n            // Wrapper\n            s.wrapper.removeAttr('style');\n        \n            // Slides\n            if (s.slides && s.slides.length) {\n                s.slides\n                    .removeClass([\n                      s.params.slideVisibleClass,\n                      s.params.slideActiveClass,\n                      s.params.slideNextClass,\n                      s.params.slidePrevClass\n                    ].join(' '))\n                    .removeAttr('style')\n                    .removeAttr('data-swiper-column')\n                    .removeAttr('data-swiper-row');\n            }\n        \n            // Pagination/Bullets\n            if (s.paginationContainer && s.paginationContainer.length) {\n                s.paginationContainer.removeClass(s.params.paginationHiddenClass);\n            }\n            if (s.bullets && s.bullets.length) {\n                s.bullets.removeClass(s.params.bulletActiveClass);\n            }\n        \n            // Buttons\n            if (s.params.prevButton) $(s.params.prevButton).removeClass(s.params.buttonDisabledClass);\n            if (s.params.nextButton) $(s.params.nextButton).removeClass(s.params.buttonDisabledClass);\n        \n            // Scrollbar\n            if (s.params.scrollbar && s.scrollbar) {\n                if (s.scrollbar.track && s.scrollbar.track.length) s.scrollbar.track.removeAttr('style');\n                if (s.scrollbar.drag && s.scrollbar.drag.length) s.scrollbar.drag.removeAttr('style');\n            }\n        };\n        \n        // Destroy\n        s.destroy = function (deleteInstance, cleanupStyles) {\n            // Detach evebts\n            s.detachEvents();\n            // Stop autoplay\n            s.stopAutoplay();\n            // Disable draggable\n            if (s.params.scrollbar && s.scrollbar) {\n                if (s.params.scrollbarDraggable) {\n                    s.scrollbar.disableDraggable();\n                }\n            }\n            // Destroy loop\n            if (s.params.loop) {\n                s.destroyLoop();\n            }\n            // Cleanup styles\n            if (cleanupStyles) {\n                s.cleanupStyles();\n            }\n            // Disconnect observer\n            s.disconnectObservers();\n        \n            // Destroy zoom\n            if (s.params.zoom && s.zoom) {\n                s.zoom.destroy();\n            }\n            // Disable keyboard/mousewheel\n            if (s.params.keyboardControl) {\n                if (s.disableKeyboardControl) s.disableKeyboardControl();\n            }\n            if (s.params.mousewheelControl) {\n                if (s.disableMousewheelControl) s.disableMousewheelControl();\n            }\n            // Disable a11y\n            if (s.params.a11y && s.a11y) s.a11y.destroy();\n            // Delete history popstate\n            if (s.params.history && !s.params.replaceState) {\n                window.removeEventListener('popstate', s.history.setHistoryPopState);\n            }\n            if (s.params.hashnav && s.hashnav)  {\n                s.hashnav.destroy();\n            }\n            // Destroy callback\n            s.emit('onDestroy');\n            // Delete instance\n            if (deleteInstance !== false) s = null;\n        };\n        \n        s.init();\n        \n    \n    \n        // Return swiper instance\n        return s;\n    };\n    \n    /*==================================================\n        Prototype\n    ====================================================*/\n    Swiper.prototype = {\n        isSafari: (function () {\n            var ua = navigator.userAgent.toLowerCase();\n            return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);\n        })(),\n        isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent),\n        isArray: function (arr) {\n            return Object.prototype.toString.apply(arr) === '[object Array]';\n        },\n        /*==================================================\n        Browser\n        ====================================================*/\n        browser: {\n            ie: window.navigator.pointerEnabled || window.navigator.msPointerEnabled,\n            ieTouch: (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 1) || (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 1),\n            lteIE9: (function() {\n                // create temporary DIV\n                var div = document.createElement('div');\n                // add content to tmp DIV which is wrapped into the IE HTML conditional statement\n                div.innerHTML = '<!--[if lte IE 9]><i></i><![endif]-->';\n                // return true / false value based on what will browser render\n                return div.getElementsByTagName('i').length === 1;\n            })()\n        },\n        /*==================================================\n        Devices\n        ====================================================*/\n        device: (function () {\n            var ua = navigator.userAgent;\n            var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\n            var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n            var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n            var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n            return {\n                ios: ipad || iphone || ipod,\n                android: android\n            };\n        })(),\n        /*==================================================\n        Feature Detection\n        ====================================================*/\n        support: {\n            touch : (window.Modernizr && Modernizr.touch === true) || (function () {\n                return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);\n            })(),\n    \n            transforms3d : (window.Modernizr && Modernizr.csstransforms3d === true) || (function () {\n                var div = document.createElement('div').style;\n                return ('webkitPerspective' in div || 'MozPerspective' in div || 'OPerspective' in div || 'MsPerspective' in div || 'perspective' in div);\n            })(),\n    \n            flexbox: (function () {\n                var div = document.createElement('div').style;\n                var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient').split(' ');\n                for (var i = 0; i < styles.length; i++) {\n                    if (styles[i] in div) return true;\n                }\n            })(),\n    \n            observer: (function () {\n                return ('MutationObserver' in window || 'WebkitMutationObserver' in window);\n            })(),\n    \n            passiveListener: (function () {\n                var supportsPassive = false;\n                try {\n                    var opts = Object.defineProperty({}, 'passive', {\n                        get: function() {\n                            supportsPassive = true;\n                        }\n                    });\n                    window.addEventListener('testPassiveListener', null, opts);\n                } catch (e) {}\n                return supportsPassive;\n            })(),\n    \n            gestures: (function () {\n                return 'ongesturestart' in window;\n            })()\n        },\n        /*==================================================\n        Plugins\n        ====================================================*/\n        plugins: {}\n    };\n\n})();\n\n//# sourceMappingURL=framework7.js.map\n"],"sourceRoot":"/source/"}