diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b869482 --- /dev/null +++ b/.gitignore @@ -0,0 +1,82 @@ + +# Created by https://www.gitignore.io/api/xcode,swift + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +.DS_Store + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +.build/ + +# CocoaPods - Refactored to standalone file + +# Carthage - Refactored to standalone file + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated + +## Various settings + +## Other + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + +# End of https://www.gitignore.io/api/xcode,swift,cocoapods \ No newline at end of file diff --git a/APFancyPager.xcodeproj/project.pbxproj b/APFancyPager.xcodeproj/project.pbxproj index bb14976..937818b 100644 --- a/APFancyPager.xcodeproj/project.pbxproj +++ b/APFancyPager.xcodeproj/project.pbxproj @@ -6,14 +6,38 @@ objectVersion = 50; objects = { +/* Begin PBXAggregateTarget section */ + 4115EE05213938CD0099991F /* Universal */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 4115EE06213938CD0099991F /* Build configuration list for PBXAggregateTarget "Universal" */; + buildPhases = ( + 4115EE09213938DC0099991F /* ShellScript */, + ); + dependencies = ( + ); + name = Universal; + productName = Universal; + }; +/* End PBXAggregateTarget section */ + /* Begin PBXBuildFile section */ 4115EDFF213938B40099991F /* APFancyPager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4115EDFD213938B40099991F /* APFancyPager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4115EE0B2139395C0099991F /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 4115EE0A2139395C0099991F /* README.md */; }; + 4115EE0D213939820099991F /* APFancyPagerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4115EE0C213939820099991F /* APFancyPagerViewController.swift */; }; + 4115EE1321397EA00099991F /* Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4115EE1221397EA00099991F /* Util.swift */; }; + 41869F4B213D2560008956F8 /* APFancyPagerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41869F4A213D2560008956F8 /* APFancyPagerDataSource.swift */; }; + 41869F4D213D264D008956F8 /* APFancyPagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41869F4C213D264D008956F8 /* APFancyPagerDelegate.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 4115EDFA213938B40099991F /* APFancyPager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = APFancyPager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4115EDFD213938B40099991F /* APFancyPager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APFancyPager.h; sourceTree = ""; }; 4115EDFE213938B40099991F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4115EE0A2139395C0099991F /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; + 4115EE0C213939820099991F /* APFancyPagerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APFancyPagerViewController.swift; sourceTree = ""; }; + 4115EE1221397EA00099991F /* Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Util.swift; sourceTree = ""; }; + 41869F4A213D2560008956F8 /* APFancyPagerDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APFancyPagerDataSource.swift; sourceTree = ""; }; + 41869F4C213D264D008956F8 /* APFancyPagerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APFancyPagerDelegate.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -46,12 +70,33 @@ 4115EDFC213938B40099991F /* APFancyPager */ = { isa = PBXGroup; children = ( + 41869F49213D2549008956F8 /* Protocols */, + 4115EE1121397E950099991F /* Util */, 4115EDFD213938B40099991F /* APFancyPager.h */, 4115EDFE213938B40099991F /* Info.plist */, + 4115EE0A2139395C0099991F /* README.md */, + 4115EE0C213939820099991F /* APFancyPagerViewController.swift */, ); path = APFancyPager; sourceTree = ""; }; + 4115EE1121397E950099991F /* Util */ = { + isa = PBXGroup; + children = ( + 4115EE1221397EA00099991F /* Util.swift */, + ); + path = Util; + sourceTree = ""; + }; + 41869F49213D2549008956F8 /* Protocols */ = { + isa = PBXGroup; + children = ( + 41869F4A213D2560008956F8 /* APFancyPagerDataSource.swift */, + 41869F4C213D264D008956F8 /* APFancyPagerDelegate.swift */, + ); + path = Protocols; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -95,6 +140,10 @@ TargetAttributes = { 4115EDF9213938B40099991F = { CreatedOnToolsVersion = 9.4.1; + LastSwiftMigration = 0940; + }; + 4115EE05213938CD0099991F = { + CreatedOnToolsVersion = 9.4.1; }; }; }; @@ -111,6 +160,7 @@ projectRoot = ""; targets = ( 4115EDF9213938B40099991F /* APFancyPager */, + 4115EE05213938CD0099991F /* Universal */, ); }; /* End PBXProject section */ @@ -120,16 +170,37 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4115EE0B2139395C0099991F /* README.md in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 4115EE09213938DC0099991F /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/bin/sh\n\nUNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal\n\n# make sure the output directory exists\nmkdir -p \"${UNIVERSAL_OUTPUTFOLDER}\"\n\n# Step 1. Build Device and Simulator versions\nxcodebuild -target \"${PROJECT_NAME}\" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" clean build\nxcodebuild -target \"${PROJECT_NAME}\" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" clean build\n\n# Step 2. Copy the framework structure (from iphoneos build) to the universal folder\ncp -R \"${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework\" \"${UNIVERSAL_OUTPUTFOLDER}/\"\n\n# Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory\nSIMULATOR_SWIFT_MODULES_DIR=\"${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/.\"\nif [ -d \"${SIMULATOR_SWIFT_MODULES_DIR}\" ]; then\ncp -R \"${SIMULATOR_SWIFT_MODULES_DIR}\" \"${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule\"\nfi\n\n# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory\nlipo -create -output \"${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}\" \"${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}\" \"${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}\"\n\n# Step 5. Convenience step to copy the framework to the project's directory\ncp -R \"${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework\" \"${PROJECT_DIR}/build\"\n\n# Step 6. Convenience step to open the project's directory in Finder\nopen \"${PROJECT_DIR}\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 4115EDF5213938B40099991F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4115EE0D213939820099991F /* APFancyPagerViewController.swift in Sources */, + 41869F4D213D264D008956F8 /* APFancyPagerDelegate.swift in Sources */, + 4115EE1321397EA00099991F /* Util.swift in Sources */, + 41869F4B213D2560008956F8 /* APFancyPagerDataSource.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -259,6 +330,7 @@ 4115EE03213938B40099991F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; @@ -267,6 +339,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = APFancyPager/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -275,7 +348,8 @@ PRODUCT_BUNDLE_IDENTIFIER = tr.com.apps.APFancyPager; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -283,6 +357,7 @@ 4115EE04213938B40099991F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; @@ -291,6 +366,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = APFancyPager/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -299,11 +375,27 @@ PRODUCT_BUNDLE_IDENTIFIER = tr.com.apps.APFancyPager; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; + 4115EE07213938CD0099991F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 4115EE08213938CD0099991F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -325,6 +417,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4115EE06213938CD0099991F /* Build configuration list for PBXAggregateTarget "Universal" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4115EE07213938CD0099991F /* Debug */, + 4115EE08213938CD0099991F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 4115EDF1213938B40099991F /* Project object */; diff --git a/APFancyPager.xcodeproj/xcuserdata/mert.xcuserdatad/xcschemes/xcschememanagement.plist b/APFancyPager.xcodeproj/xcuserdata/mert.xcuserdatad/xcschemes/xcschememanagement.plist index 20d41ce..99e1bcf 100644 --- a/APFancyPager.xcodeproj/xcuserdata/mert.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/APFancyPager.xcodeproj/xcuserdata/mert.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,6 +9,11 @@ orderHint 0 + Universal.xcscheme + + orderHint + 1 + diff --git a/APFancyPager/APFancyPagerViewController.swift b/APFancyPager/APFancyPagerViewController.swift new file mode 100644 index 0000000..d27c0d9 --- /dev/null +++ b/APFancyPager/APFancyPagerViewController.swift @@ -0,0 +1,225 @@ +// +// APFancyPagerViewController.swift +// APFancyPager +// +// Created by Orhun Mert Şimşek on 31.08.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +import UIKit + +/// Our almighty class which is simply a UIViewController. Everything starts by using this view controller. +open class APFancyPagerViewController: UIViewController, UIScrollViewDelegate { + + /// Delegate variable, you don't have to set this. + open weak var delegate: APFancyPagerDelegate? + /// Datasource variable, you have to set this. + open weak var dataSource: APFancyPagerDataSource? + + /// Label for header title. + private let headerTitleLabel = UILabel() + /// Container scroll view which we later add our view controllers into. + private let containerScrollView = UIScrollView() + /// Conatiner view that contains header title and a small padding for status bar. + private let headerContainerView = UIView() + + /// Total header height. + private var headerHeight: CGFloat! + /// Total number of controllers. + private var numberOfControllers: Int! + /// This variable used for detection of the scroll direction. + private var lastPercentage: CGFloat = 0.0 + + /// Some initialization codes. + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + /// Still some initialization codes. + public init() { + super.init(nibName: nil, bundle: nil) + } + + /// The viewDidLoad function that we also override from UIViewController. But you already know that. + open override func viewDidLoad() { + super.viewDidLoad() + + self.view.backgroundColor = UIColor.white + + if (dataSource == nil) { + return + } + + initializeViews() + } + + /// Initialization of the views. + private func initializeViews() { + reloadData() + + headerContainerView.frame = CGRect(x: 0.0, y: 0.0, width: self.view.bounds.width, height: headerHeight) + headerContainerView.backgroundColor = dataSource!.fancyPagerViewController(self, headerBackgroundColorForIndex: 0) + self.view.addSubview(headerContainerView) + + headerTitleLabel.frame = CGRect(x: 0, y: Util.statusBarHeight(), width: headerContainerView.bounds.width, height: headerContainerView.frame.height - Util.statusBarHeight()) + headerTitleLabel.text = dataSource!.fancyPagerViewController(self, headerStringForIndex: 0) + headerTitleLabel.textColor = dataSource!.fancyPagerViewController(self, headerTextColorForIndex: 0) + headerTitleLabel.font = UIFont.systemFont(ofSize: 22.0) + headerTitleLabel.textAlignment = .center + headerTitleLabel.minimumScaleFactor = 0.2 + headerTitleLabel.adjustsFontSizeToFitWidth = true + headerContainerView.addSubview(headerTitleLabel) + + containerScrollView.frame = CGRect(x: 0, y: headerHeight, width: self.view.bounds.width, height: self.view.bounds.height - headerHeight) + containerScrollView.contentSize = CGSize(width: containerScrollView.bounds.width * CGFloat(numberOfControllers), height: containerScrollView.bounds.height) + containerScrollView.delegate = self + containerScrollView.bounces = false + containerScrollView.isPagingEnabled = true + self.view.addSubview(containerScrollView) + + addViewControllersToPager() + + } + + /// This function adds view controllers to + /// the **APFancyPager**. Does not take any + /// parameters, does things by using the + /// data source which is already provided. + private func addViewControllersToPager() { + + var xVal: CGFloat = 0.0 + + for index in 0...numberOfControllers { + let currentVC = dataSource!.fancyPagerViewController(self, viewControllerForIndex: index) + + self.addChild(currentVC) + currentVC.view.frame = CGRect(x: xVal, y: 0.0, width: containerScrollView.bounds.width, height: containerScrollView.bounds.height) + containerScrollView.addSubview(currentVC.view) + currentVC.willMove(toParent: self) + + xVal += containerScrollView.bounds.width + } + } + + /// Use this function in order to reload the APFancyPager. + open func reloadData() { + headerHeight = dataSource!.heightForHeader(self) + numberOfControllers = dataSource!.numberOfViewControllers(self) + } + + /** + You can use this function in order to scroll to the specific index of the APFancyPager. + - parameter pageNumber: Page number that you want to scroll to. **Friendly reminder:** Sure, you already know that but anyways, this number starts with the **0(zero)**. + - parameter animated: Should this scrolling be animated or not? + */ + open func scrollToPage(_ pageNumber: Int, animated: Bool) { + if (pageNumber >= 0 && pageNumber < numberOfControllers) { + containerScrollView.scrollRectToVisible(CGRect(x: containerScrollView.bounds.width * CGFloat(pageNumber), y: 0.0, width: containerScrollView.bounds.width, height: containerScrollView.bounds.height), animated: animated) + } + } + + /** + This great function helps to animate the header title. + + - parameter sourceString: Which string is the our start string. + - parameter destinationString: Which string is the our end string. + - parameter percentage: Percentage of the progress of the transition. + + */ + private func animateHeaderTitle(_ sourceString: String, _ destinationString: String, _ percentage: CGFloat) { + + let maxLetterCount = max(sourceString.count, destinationString.count) + let changingLetterCountTreshold = 1.0 / Double(maxLetterCount) + let indexOfCharacter = Int(floor(Double(percentage) / changingLetterCountTreshold)) + + var tempSourceString = sourceString + var tempDestinationString = destinationString + + var newString = "" + + if (indexOfCharacter >= sourceString.count) { + for _ in 0...(maxLetterCount - sourceString.count) { + tempSourceString.append(" ") + } + } else if (indexOfCharacter >= destinationString.count) { + for _ in 0...(maxLetterCount - destinationString.count) { + tempDestinationString.append(" ") + } + } + + newString = String(tempSourceString[indexOfCharacter...(tempSourceString.count - 1)]) + if (indexOfCharacter != 0) { + newString += String(tempDestinationString[0...indexOfCharacter - 1]) + } + + headerTitleLabel.text = newString + } + + /** + We use this function to get scroll movements of our scrollview. + + - parameter scrollView: UIScrollView that is currently being used. + + */ + open func scrollViewDidScroll(_ scrollView: UIScrollView) { + + let pageNumber = floorf(Float(scrollView.contentOffset.x / (scrollView.frame.size.width))) + let percentageOffset = (scrollView.contentOffset.x / scrollView.frame.width) - CGFloat(pageNumber) + + if (percentageOffset > 0.0) { + if (numberOfControllers > Int(pageNumber) + 1) { + + if (lastPercentage < percentageOffset) { + delegate?.fancyPagerViewController(self, isScrollingFromIndex: Int(pageNumber), toIndex: Int(pageNumber + 1), progress: percentageOffset) + } else if (lastPercentage > percentageOffset) { + delegate?.fancyPagerViewController(self, isScrollingFromIndex: Int(pageNumber + 1), toIndex: Int(pageNumber), progress: 1.0 - percentageOffset) + } + lastPercentage = percentageOffset + + let prevBackgroundColor = dataSource!.fancyPagerViewController(self, headerBackgroundColorForIndex: Int(pageNumber)) + let nextBackgroundColor = dataSource!.fancyPagerViewController(self, headerBackgroundColorForIndex: Int(pageNumber + 1)) + + let prevTitleColor = dataSource!.fancyPagerViewController(self, headerTextColorForIndex: Int(pageNumber)) + let nextTitleColor = dataSource!.fancyPagerViewController(self, headerTextColorForIndex: Int(pageNumber + 1)) + + let prevTitleString = dataSource!.fancyPagerViewController(self, headerStringForIndex: Int(pageNumber)) + let nextTitleString = dataSource!.fancyPagerViewController(self, headerStringForIndex: Int(pageNumber + 1)) + + headerContainerView.backgroundColor = UIColor.init(red: (prevBackgroundColor.rgba.red + ((nextBackgroundColor.rgba.red - prevBackgroundColor.rgba.red) * percentageOffset)), green: (prevBackgroundColor.rgba.green + ((nextBackgroundColor.rgba.green - prevBackgroundColor.rgba.green) * percentageOffset)), blue: (prevBackgroundColor.rgba.blue + ((nextBackgroundColor.rgba.blue - prevBackgroundColor.rgba.blue) * percentageOffset)), alpha: (prevBackgroundColor.rgba.alpha + ((nextBackgroundColor.rgba.alpha - prevBackgroundColor.rgba.alpha) * percentageOffset))) + + headerTitleLabel.textColor = UIColor.init(red: (prevTitleColor.rgba.red + ((nextTitleColor.rgba.red - prevTitleColor.rgba.red) * percentageOffset)), green: (prevTitleColor.rgba.green + ((nextTitleColor.rgba.green - prevTitleColor.rgba.green) * percentageOffset)), blue: (prevTitleColor.rgba.blue + ((nextTitleColor.rgba.blue - prevTitleColor.rgba.blue) * percentageOffset)), alpha: (prevTitleColor.rgba.alpha + ((nextTitleColor.rgba.alpha - prevTitleColor.rgba.alpha) * percentageOffset))) + + animateHeaderTitle(prevTitleString, nextTitleString, percentageOffset) + } + } + } + + /** + We use this function also to get scroll movements of our scrollview. + + - parameter scrollView: UIScrollView that is currently being used. + + */ + open func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { + let pageNumber = roundf(Float(scrollView.contentOffset.x / (scrollView.frame.size.width))) + headerContainerView.backgroundColor = dataSource!.fancyPagerViewController(self, headerBackgroundColorForIndex: Int(pageNumber)) + headerTitleLabel.text = dataSource!.fancyPagerViewController(self, headerStringForIndex: Int(pageNumber)) + + delegate?.fancyPagerViewController(self, didScrollToIndex: Int(pageNumber)) + } + + /** + We use this function also to get scroll movements of our scrollview. + + - parameter scrollView: UIScrollView that is currently being used. + + */ + open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + let pageNumber = roundf(Float(scrollView.contentOffset.x / (scrollView.frame.size.width))) + headerContainerView.backgroundColor = dataSource!.fancyPagerViewController(self, headerBackgroundColorForIndex: Int(pageNumber)) + headerTitleLabel.text = dataSource!.fancyPagerViewController(self, headerStringForIndex: Int(pageNumber)) + + delegate?.fancyPagerViewController(self, didScrollToIndex: Int(pageNumber)) + } + +} diff --git a/APFancyPager/Protocols/APFancyPagerDataSource.swift b/APFancyPager/Protocols/APFancyPagerDataSource.swift new file mode 100644 index 0000000..18165ad --- /dev/null +++ b/APFancyPager/Protocols/APFancyPagerDataSource.swift @@ -0,0 +1,66 @@ +// +// APFancyPagerDataSource.swift +// APFancyPager +// +// Created by Orhun Mert Şimşek on 3.09.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +import UIKit + +/// Data source protocol for APFancyPager +@objc public protocol APFancyPagerDataSource: class { + + /** + You should implement this function in order to tell the number of your view controllers that will be used in the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + + - returns: Number of view controllers that will be used in the APFancyPager + */ + func numberOfViewControllers(_ fancyPagerViewController: APFancyPagerViewController) -> Int + + /** + You should implement this function in order to tell the view controllers that will be used in the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + - parameter viewControllerForIndex: Index parameter of the view controller that will be used in the APFancyPager. + + - returns: View controller that will be used in the APFancyPager + */ + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, viewControllerForIndex index: Int) -> UIViewController + + /** + You should implement this function in order to tell the header height of the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + + - returns: Header height of the APFancyPager + */ + func heightForHeader(_ fancyPagerViewController: APFancyPagerViewController) -> CGFloat + + /** + You should implement this function in order to tell the header string at the given index of the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + - parameter headerStringForIndex: Index parameter of the header that used in the APFancyPager. + + - returns: Header string of the given index of the APFancyPager + */ + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerStringForIndex index: Int) -> String + + /** + You should implement this function in order to tell the header background color at the given index of the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + - parameter headerBackgroundColorForIndex: Index parameter of the header that used in the APFancyPager. + + - returns: Header background color of the given index of the APFancyPager + */ + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerBackgroundColorForIndex index: Int) -> UIColor + + /** + You should implement this function in order to tell the header text color at the given index of the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + - parameter headerTextColorForIndex: Index parameter of the header that used in the APFancyPager. + + - returns: Header text color of the given index of the APFancyPager + */ + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerTextColorForIndex index: Int) -> UIColor + +} diff --git a/APFancyPager/Protocols/APFancyPagerDelegate.swift b/APFancyPager/Protocols/APFancyPagerDelegate.swift new file mode 100644 index 0000000..6979a5a --- /dev/null +++ b/APFancyPager/Protocols/APFancyPagerDelegate.swift @@ -0,0 +1,40 @@ +// +// APFancyPagerDelegate.swift +// APFancyPager +// +// Created by Orhun Mert Şimşek on 3.09.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +import UIKit + +/// Delegate protocol for APFancyPager +@objc public protocol APFancyPagerDelegate: class { + + /** + You can implement this function in order to get information while the user is scrolling through the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + - parameter isScrollingFromIndex: Index parameter that user started to scrolling **from** in the APFancyPager. + - parameter toIndex: Index parameter that user started to scrolling **to** in the APFancyPager. + - parameter progress: Progress of the scrolling. + */ + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, isScrollingFromIndex fromIndex: Int, toIndex: Int, progress: CGFloat) + + /** + You can implement this function in order to get information when the user did scroll successfully through the APFancyPager. + - parameter fancyPagerViewController: APFancyPagerViewController object of currently using. + - parameter didScrollToIndex: Index parameter that user scrolled in the APFancyPager. + */ + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, didScrollToIndex index: Int) +} + +public extension APFancyPagerDelegate { + + public func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, isScrollingFromIndex fromIndex: Int, toIndex: Int, progress: CGFloat) { + return + } + + public func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, didScrollToIndex index: Int) { + return + } +} diff --git a/APFancyPager/Util/Util.swift b/APFancyPager/Util/Util.swift new file mode 100644 index 0000000..ee43631 --- /dev/null +++ b/APFancyPager/Util/Util.swift @@ -0,0 +1,92 @@ +// +// Util.swift +// APFancyPager +// +// Created by Orhun Mert Şimşek on 31.08.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +import UIKit + +/// There are some utility things. +open class Util { + + /** + An easy way to get status bar height. + + - returns: Status bar height. Simple, isn't it? + */ + class func statusBarHeight() -> CGFloat { + return UIApplication.shared.statusBarFrame.height + } + +} + +extension UIColor { + var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { + var red: CGFloat = 0 + var green: CGFloat = 0 + var blue: CGFloat = 0 + var alpha: CGFloat = 0 + getRed(&red, green: &green, blue: &blue, alpha: &alpha) + + return (red, green, blue, alpha) + } +} + +extension String { + subscript (i: Int) -> Character { + return self[index(startIndex, offsetBy: i)] + } + subscript (bounds: CountableRange) -> Substring { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[start ..< end] + } + subscript (bounds: CountableClosedRange) -> Substring { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[start ... end] + } + subscript (bounds: CountablePartialRangeFrom) -> Substring { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(endIndex, offsetBy: -1) + return self[start ... end] + } + subscript (bounds: PartialRangeThrough) -> Substring { + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[startIndex ... end] + } + subscript (bounds: PartialRangeUpTo) -> Substring { + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[startIndex ..< end] + } +} +extension Substring { + subscript (i: Int) -> Character { + return self[index(startIndex, offsetBy: i)] + } + subscript (bounds: CountableRange) -> Substring { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[start ..< end] + } + subscript (bounds: CountableClosedRange) -> Substring { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[start ... end] + } + subscript (bounds: CountablePartialRangeFrom) -> Substring { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(endIndex, offsetBy: -1) + return self[start ... end] + } + subscript (bounds: PartialRangeThrough) -> Substring { + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[startIndex ... end] + } + subscript (bounds: PartialRangeUpTo) -> Substring { + let end = index(startIndex, offsetBy: bounds.upperBound) + return self[startIndex ..< end] + } +} diff --git a/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.pbxproj b/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ccc863f --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.pbxproj @@ -0,0 +1,377 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 4115EE2121397FE70099991F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4115EE2021397FE70099991F /* AppDelegate.swift */; }; + 4115EE2321397FE70099991F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4115EE2221397FE70099991F /* ViewController.swift */; }; + 4115EE2621397FE70099991F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4115EE2421397FE70099991F /* Main.storyboard */; }; + 4115EE2821397FE80099991F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4115EE2721397FE80099991F /* Assets.xcassets */; }; + 4115EE2B21397FE80099991F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4115EE2921397FE80099991F /* LaunchScreen.storyboard */; }; + 4115EE3B213981430099991F /* APFancyPager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4115EE3A213981420099991F /* APFancyPager.framework */; }; + 4115EE3C213981430099991F /* APFancyPager.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4115EE3A213981420099991F /* APFancyPager.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 4115EE36213980860099991F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4115EE3C213981430099991F /* APFancyPager.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4115EE1D21397FE70099991F /* APFancyPagerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = APFancyPagerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4115EE2021397FE70099991F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 4115EE2221397FE70099991F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 4115EE2521397FE70099991F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 4115EE2721397FE80099991F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4115EE2A21397FE80099991F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 4115EE2C21397FE80099991F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4115EE3A213981420099991F /* APFancyPager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = APFancyPager.framework; path = APFancyPagerDemo/APFancyPager.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4115EE1A21397FE70099991F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4115EE3B213981430099991F /* APFancyPager.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4115EE1421397FE70099991F = { + isa = PBXGroup; + children = ( + 4115EE3A213981420099991F /* APFancyPager.framework */, + 4115EE1F21397FE70099991F /* APFancyPagerDemo */, + 4115EE1E21397FE70099991F /* Products */, + 4115EE37213980B20099991F /* Frameworks */, + ); + sourceTree = ""; + }; + 4115EE1E21397FE70099991F /* Products */ = { + isa = PBXGroup; + children = ( + 4115EE1D21397FE70099991F /* APFancyPagerDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + 4115EE1F21397FE70099991F /* APFancyPagerDemo */ = { + isa = PBXGroup; + children = ( + 4115EE2021397FE70099991F /* AppDelegate.swift */, + 4115EE2221397FE70099991F /* ViewController.swift */, + 4115EE2421397FE70099991F /* Main.storyboard */, + 4115EE2721397FE80099991F /* Assets.xcassets */, + 4115EE2921397FE80099991F /* LaunchScreen.storyboard */, + 4115EE2C21397FE80099991F /* Info.plist */, + ); + path = APFancyPagerDemo; + sourceTree = ""; + }; + 4115EE37213980B20099991F /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4115EE1C21397FE70099991F /* APFancyPagerDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4115EE2F21397FE80099991F /* Build configuration list for PBXNativeTarget "APFancyPagerDemo" */; + buildPhases = ( + 4115EE1921397FE70099991F /* Sources */, + 4115EE1A21397FE70099991F /* Frameworks */, + 4115EE1B21397FE70099991F /* Resources */, + 4115EE36213980860099991F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = APFancyPagerDemo; + productName = APFancyPagerDemo; + productReference = 4115EE1D21397FE70099991F /* APFancyPagerDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4115EE1521397FE70099991F /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = Apps; + TargetAttributes = { + 4115EE1C21397FE70099991F = { + CreatedOnToolsVersion = 9.4.1; + }; + }; + }; + buildConfigurationList = 4115EE1821397FE70099991F /* Build configuration list for PBXProject "APFancyPagerDemo" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4115EE1421397FE70099991F; + productRefGroup = 4115EE1E21397FE70099991F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4115EE1C21397FE70099991F /* APFancyPagerDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4115EE1B21397FE70099991F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4115EE2B21397FE80099991F /* LaunchScreen.storyboard in Resources */, + 4115EE2821397FE80099991F /* Assets.xcassets in Resources */, + 4115EE2621397FE70099991F /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4115EE1921397FE70099991F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4115EE2321397FE70099991F /* ViewController.swift in Sources */, + 4115EE2121397FE70099991F /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 4115EE2421397FE70099991F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4115EE2521397FE70099991F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 4115EE2921397FE80099991F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4115EE2A21397FE80099991F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 4115EE2D21397FE80099991F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 4115EE2E21397FE80099991F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4115EE3021397FE80099991F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = PP2W8XD946; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/APFancyPagerDemo", + ); + INFOPLIST_FILE = APFancyPagerDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = tr.com.apps.APFancyPagerDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4115EE3121397FE80099991F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = PP2W8XD946; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/APFancyPagerDemo", + ); + INFOPLIST_FILE = APFancyPagerDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = tr.com.apps.APFancyPagerDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4115EE1821397FE70099991F /* Build configuration list for PBXProject "APFancyPagerDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4115EE2D21397FE80099991F /* Debug */, + 4115EE2E21397FE80099991F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4115EE2F21397FE80099991F /* Build configuration list for PBXNativeTarget "APFancyPagerDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4115EE3021397FE80099991F /* Debug */, + 4115EE3121397FE80099991F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4115EE1521397FE70099991F /* Project object */; +} diff --git a/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9952eaa --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/APFancyPager b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/APFancyPager new file mode 100755 index 0000000..99fd29f Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/APFancyPager differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Headers/APFancyPager-Swift.h b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Headers/APFancyPager-Swift.h new file mode 100644 index 0000000..a291f33 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Headers/APFancyPager-Swift.h @@ -0,0 +1,226 @@ +// Generated by Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgcc-compat" + +#if !defined(__has_include) +# define __has_include(x) 0 +#endif +#if !defined(__has_attribute) +# define __has_attribute(x) 0 +#endif +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif +#if !defined(__has_warning) +# define __has_warning(x) 0 +#endif + +#if __has_include() +# include +#endif + +#pragma clang diagnostic ignored "-Wauto-import" +#include +#include +#include +#include + +#if !defined(SWIFT_TYPEDEFS) +# define SWIFT_TYPEDEFS 1 +# if __has_include() +# include +# elif !defined(__cplusplus) +typedef uint_least16_t char16_t; +typedef uint_least32_t char32_t; +# endif +typedef float swift_float2 __attribute__((__ext_vector_type__(2))); +typedef float swift_float3 __attribute__((__ext_vector_type__(3))); +typedef float swift_float4 __attribute__((__ext_vector_type__(4))); +typedef double swift_double2 __attribute__((__ext_vector_type__(2))); +typedef double swift_double3 __attribute__((__ext_vector_type__(3))); +typedef double swift_double4 __attribute__((__ext_vector_type__(4))); +typedef int swift_int2 __attribute__((__ext_vector_type__(2))); +typedef int swift_int3 __attribute__((__ext_vector_type__(3))); +typedef int swift_int4 __attribute__((__ext_vector_type__(4))); +typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); +typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); +typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); +#endif + +#if !defined(SWIFT_PASTE) +# define SWIFT_PASTE_HELPER(x, y) x##y +# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) +#endif +#if !defined(SWIFT_METATYPE) +# define SWIFT_METATYPE(X) Class +#endif +#if !defined(SWIFT_CLASS_PROPERTY) +# if __has_feature(objc_class_property) +# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ +# else +# define SWIFT_CLASS_PROPERTY(...) +# endif +#endif + +#if __has_attribute(objc_runtime_name) +# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) +#else +# define SWIFT_RUNTIME_NAME(X) +#endif +#if __has_attribute(swift_name) +# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) +#else +# define SWIFT_COMPILE_NAME(X) +#endif +#if __has_attribute(objc_method_family) +# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) +#else +# define SWIFT_METHOD_FAMILY(X) +#endif +#if __has_attribute(noescape) +# define SWIFT_NOESCAPE __attribute__((noescape)) +#else +# define SWIFT_NOESCAPE +#endif +#if __has_attribute(warn_unused_result) +# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +# define SWIFT_WARN_UNUSED_RESULT +#endif +#if __has_attribute(noreturn) +# define SWIFT_NORETURN __attribute__((noreturn)) +#else +# define SWIFT_NORETURN +#endif +#if !defined(SWIFT_CLASS_EXTRA) +# define SWIFT_CLASS_EXTRA +#endif +#if !defined(SWIFT_PROTOCOL_EXTRA) +# define SWIFT_PROTOCOL_EXTRA +#endif +#if !defined(SWIFT_ENUM_EXTRA) +# define SWIFT_ENUM_EXTRA +#endif +#if !defined(SWIFT_CLASS) +# if __has_attribute(objc_subclassing_restricted) +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# else +# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA +# endif +#endif + +#if !defined(SWIFT_PROTOCOL) +# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA +#endif + +#if !defined(SWIFT_EXTENSION) +# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) +#endif + +#if !defined(OBJC_DESIGNATED_INITIALIZER) +# if __has_attribute(objc_designated_initializer) +# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) +# else +# define OBJC_DESIGNATED_INITIALIZER +# endif +#endif +#if !defined(SWIFT_ENUM_ATTR) +# if defined(__has_attribute) && __has_attribute(enum_extensibility) +# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility))) +# else +# define SWIFT_ENUM_ATTR(_extensibility) +# endif +#endif +#if !defined(SWIFT_ENUM) +# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# if __has_feature(generalized_swift_name) +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type +# else +# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility) +# endif +#endif +#if !defined(SWIFT_UNAVAILABLE) +# define SWIFT_UNAVAILABLE __attribute__((unavailable)) +#endif +#if !defined(SWIFT_UNAVAILABLE_MSG) +# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) +#endif +#if !defined(SWIFT_AVAILABILITY) +# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) +#endif +#if !defined(SWIFT_DEPRECATED) +# define SWIFT_DEPRECATED __attribute__((deprecated)) +#endif +#if !defined(SWIFT_DEPRECATED_MSG) +# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) +#endif +#if __has_feature(attribute_diagnose_if_objc) +# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) +#else +# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) +#endif +#if __has_feature(modules) +@import CoreGraphics; +@import UIKit; +#endif + +#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" +#pragma clang diagnostic ignored "-Wduplicate-method-arg" +#if __has_warning("-Wpragma-clang-attribute") +# pragma clang diagnostic ignored "-Wpragma-clang-attribute" +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" +#pragma clang diagnostic ignored "-Wnullability" + +#if __has_attribute(external_source_symbol) +# pragma push_macro("any") +# undef any +# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="APFancyPager",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol)) +# pragma pop_macro("any") +#endif + +@class APFancyPagerViewController; +@class UIViewController; +@class UIColor; + +SWIFT_PROTOCOL("_TtP12APFancyPager22APFancyPagerDataSource_") +@protocol APFancyPagerDataSource +- (NSInteger)numberOfViewControllersIn:(APFancyPagerViewController * _Nonnull)fancyPagerViewController SWIFT_WARN_UNUSED_RESULT; +- (UIViewController * _Nonnull)fancyPagerViewController:(APFancyPagerViewController * _Nonnull)fancyPagerViewController viewControllerForIndex:(NSInteger)index SWIFT_WARN_UNUSED_RESULT; +- (CGFloat)heightForHeader:(APFancyPagerViewController * _Nonnull)fancyPagerViewController SWIFT_WARN_UNUSED_RESULT; +- (NSString * _Nonnull)fancyPagerViewController:(APFancyPagerViewController * _Nonnull)fancyPagerViewController headerStringForIndex:(NSInteger)index SWIFT_WARN_UNUSED_RESULT; +- (UIColor * _Nonnull)fancyPagerViewController:(APFancyPagerViewController * _Nonnull)fancyPagerViewController headerBackgroundColorForIndex:(NSInteger)index SWIFT_WARN_UNUSED_RESULT; +- (UIColor * _Nonnull)fancyPagerViewController:(APFancyPagerViewController * _Nonnull)fancyPagerViewController headerTextColorForIndex:(NSInteger)index SWIFT_WARN_UNUSED_RESULT; +@end + + +SWIFT_PROTOCOL("_TtP12APFancyPager20APFancyPagerDelegate_") +@protocol APFancyPagerDelegate +- (void)fancyPagerViewController:(APFancyPagerViewController * _Nonnull)fancyPagerViewController isScrollingFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress; +- (void)fancyPagerViewController:(APFancyPagerViewController * _Nonnull)fancyPagerViewController didScrollToIndex:(NSInteger)index; +@end + +@class NSCoder; +@class UIScrollView; +@class NSBundle; + +SWIFT_CLASS("_TtC12APFancyPager26APFancyPagerViewController") +@interface APFancyPagerViewController : UIViewController +- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER; +- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; +- (void)viewDidLoad; +- (void)scrollViewDidScroll:(UIScrollView * _Nonnull)scrollView; +- (void)scrollViewDidEndScrollingAnimation:(UIScrollView * _Nonnull)scrollView; +- (void)scrollViewDidEndDecelerating:(UIScrollView * _Nonnull)scrollView; +- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil SWIFT_UNAVAILABLE; +@end + + + +#if __has_attribute(external_source_symbol) +# pragma clang attribute pop +#endif +#pragma clang diagnostic pop diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Headers/APFancyPager.h b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Headers/APFancyPager.h new file mode 100644 index 0000000..ce6f970 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Headers/APFancyPager.h @@ -0,0 +1,19 @@ +// +// APFancyPager.h +// APFancyPager +// +// Created by Orhun Mert Şimşek on 31.08.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +#import + +//! Project version number for APFancyPager. +FOUNDATION_EXPORT double APFancyPagerVersionNumber; + +//! Project version string for APFancyPager. +FOUNDATION_EXPORT const unsigned char APFancyPagerVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Info.plist b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Info.plist new file mode 100644 index 0000000..38c733b Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Info.plist differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm.swiftdoc b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm.swiftdoc new file mode 100644 index 0000000..0b80103 Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm.swiftdoc differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm.swiftmodule b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm.swiftmodule new file mode 100644 index 0000000..e2a4afb Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm.swiftmodule differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm64.swiftdoc b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm64.swiftdoc new file mode 100644 index 0000000..991badb Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm64.swiftdoc differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm64.swiftmodule b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm64.swiftmodule new file mode 100644 index 0000000..e43bdaf Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/arm64.swiftmodule differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/i386.swiftdoc b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/i386.swiftdoc new file mode 100644 index 0000000..0e5500c Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/i386.swiftdoc differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/i386.swiftmodule b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/i386.swiftmodule new file mode 100644 index 0000000..cfccb9f Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/i386.swiftmodule differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/x86_64.swiftdoc b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/x86_64.swiftdoc new file mode 100644 index 0000000..665bb26 Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/x86_64.swiftdoc differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/x86_64.swiftmodule b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/x86_64.swiftmodule new file mode 100644 index 0000000..5f3b9cf Binary files /dev/null and b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/APFancyPager.swiftmodule/x86_64.swiftmodule differ diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/module.modulemap b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/module.modulemap new file mode 100644 index 0000000..b49e766 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/Modules/module.modulemap @@ -0,0 +1,11 @@ +framework module APFancyPager { + umbrella header "APFancyPager.h" + + export * + module * { export * } +} + +module APFancyPager.Swift { + header "APFancyPager-Swift.h" + requires objc +} diff --git a/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/README.md b/APFancyPagerDemo/APFancyPagerDemo/APFancyPager.framework/README.md new file mode 100644 index 0000000..e69de29 diff --git a/APFancyPagerDemo/APFancyPagerDemo/AppDelegate.swift b/APFancyPagerDemo/APFancyPagerDemo/AppDelegate.swift new file mode 100644 index 0000000..53c4267 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// APFancyPagerDemo +// +// Created by Orhun Mert Şimşek on 31.08.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/APFancyPagerDemo/APFancyPagerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/APFancyPagerDemo/APFancyPagerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/APFancyPagerDemo/APFancyPagerDemo/Assets.xcassets/Contents.json b/APFancyPagerDemo/APFancyPagerDemo/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/APFancyPagerDemo/APFancyPagerDemo/Base.lproj/LaunchScreen.storyboard b/APFancyPagerDemo/APFancyPagerDemo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/APFancyPagerDemo/APFancyPagerDemo/Base.lproj/Main.storyboard b/APFancyPagerDemo/APFancyPagerDemo/Base.lproj/Main.storyboard new file mode 100644 index 0000000..6af0def --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/Base.lproj/Main.storyboard @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/APFancyPagerDemo/APFancyPagerDemo/Info.plist b/APFancyPagerDemo/APFancyPagerDemo/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/APFancyPagerDemo/APFancyPagerDemo/ViewController.swift b/APFancyPagerDemo/APFancyPagerDemo/ViewController.swift new file mode 100644 index 0000000..3abe91c --- /dev/null +++ b/APFancyPagerDemo/APFancyPagerDemo/ViewController.swift @@ -0,0 +1,117 @@ +// +// ViewController.swift +// APFancyPagerDemo +// +// Created by Orhun Mert Şimşek on 31.08.2018. +// Copyright © 2018 Apps. All rights reserved. +// + +import UIKit +import APFancyPager + +class ViewController: APFancyPagerViewController, APFancyPagerDelegate, APFancyPagerDataSource { + override func viewDidLoad() { + self.dataSource = self + self.delegate = self + super.viewDidLoad() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + } + + func numberOfViewControllers(in fancyPagerViewController: APFancyPagerViewController) -> Int { + return 4 + } + + func heightForHeader(_ fancyPagerViewController: APFancyPagerViewController) -> CGFloat { + return 100.0 + } + + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, viewControllerForIndex index: Int) -> UIViewController { + let viewController = UIViewController() + let button = UIButton(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)) + button.center = viewController.view.center + if (index == 0) { + button.backgroundColor = UIColor.blue + button.tag = 1 + } else if (index == 1) { + button.backgroundColor = UIColor.red + button.tag = 2 + } else if (index == 2) { + button.backgroundColor = UIColor.green + button.tag = 3 + } else if (index == 3) { + button.backgroundColor = UIColor.orange + button.tag = 0 + } + button.addTarget(self, action: #selector(buttonClicked(_:)), for: .touchUpInside) + viewController.view.addSubview(button) + return viewController + } + + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerStringForIndex index: Int) -> String { + switch index { + case 0: + return "Wow really?" + case 1: + return "What a great feature" + case 2: + return "Best pager. EVER." + case 3: + return "YES" + default: + return "" + } + } + + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerTextColorForIndex index: Int) -> UIColor { + switch index { + case 0: + return UIColor.orange + case 1: + return UIColor.white + case 2: + return UIColor.black + case 3: + return UIColor.green + default: + return UIColor.white + } + } + + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerBackgroundColorForIndex index: Int) -> UIColor { + switch index { + case 0: + return UIColor.blue + case 1: + return UIColor.red + case 2: + return UIColor.green + case 3: + return UIColor.orange + default: + return UIColor.black + } + } + + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, didScrollToIndex index: Int) { + print("DidScroll: \(index)") + } + + func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, isScrollingFromIndex fromIndex: Int, toIndex: Int, progress: CGFloat) { + print("IsScrolling: \(fromIndex) to: \(toIndex) WithProgress: \(progress)") + } + + @objc func buttonClicked(_ sender: UIButton) { + scrollToPage(sender.tag, animated: true) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7e930a8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Apps Bilgi Teknolojileri Ltd Sti + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..24b770d --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# APFancyPager +A fancy pager view controller framework for Swift/Objective-C + +[![Platform](https://img.shields.io/cocoapods/p/APFancyPager.svg)](https://github.com/AppsComTr/APFancyPager) +[![CocoaPods](https://img.shields.io/cocoapods/v/APFancyPager.svg)](https://cocoapods.org/pods/APFancyPager) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![License](http://img.shields.io/cocoapods/l/APFancyPager.svg)](https://raw.githubusercontent.com/AppsComTr/APFancyPager/master/LICENSE) + + +## Installation + +### Cocoapods +Simply add the APFancyPager to your Podfile: + +`pod 'APFancyPager'` + +### Carthage +You can use Carthage as well. Paste below line to your Cartfile: +`github "AppsComTr/APFancyPager"` + +### Manual +Also, you can copy-paste the Swift files directly into your project. + +## Usage + +You can check the demo project to get the basics of the framework. + +Simply make your view controller extend APFancyPagerViewController and also implement the data source and optionally the delegate. + +## Preview +[![App Preview](https://raw.githubusercontent.com/AppsComTr/APFancyPager/master/docs/appvideo.gif)](https://raw.githubusercontent.com/AppsComTr/APFancyPager/master/docs/appvideo.gif) + + +## License +APFancyPager is released under the MIT license. See [LICENSE](https://github.com/AppsComTr/APFancyPager/blob/master/LICENSE) for details. diff --git a/docs/Classes.html b/docs/Classes.html new file mode 100644 index 0000000..986542b --- /dev/null +++ b/docs/Classes.html @@ -0,0 +1,135 @@ + + + + Classes Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Our almighty class which is simply a UIViewController. Everything starts by using this view controller.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class APFancyPagerViewController : UIViewController, UIScrollViewDelegate
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Util + +
    +
    +
    +
    +
    +
    +

    There are some utility things.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class Util
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/APFancyPagerViewController.html b/docs/Classes/APFancyPagerViewController.html new file mode 100644 index 0000000..08969fc --- /dev/null +++ b/docs/Classes/APFancyPagerViewController.html @@ -0,0 +1,440 @@ + + + + APFancyPagerViewController Class Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

APFancyPagerViewController

+
+
+
open class APFancyPagerViewController : UIViewController, UIScrollViewDelegate
+ +
+
+

Our almighty class which is simply a UIViewController. Everything starts by using this view controller.

+ +
+
+
+
    +
  • +
    + + + + delegate + +
    +
    +
    +
    +
    +
    +

    Delegate variable, you don’t have to set this.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open weak var delegate: APFancyPagerDelegate?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dataSource + +
    +
    +
    +
    +
    +
    +

    Datasource variable, you have to set this.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open weak var dataSource: APFancyPagerDataSource?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(coder:) + +
    +
    +
    +
    +
    +
    +

    Some initialization codes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public required init?(coder aDecoder: NSCoder)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Still some initialization codes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + viewDidLoad() + +
    +
    +
    +
    +
    +
    +

    The viewDidLoad function that we also override from UIViewController. But you already know that.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open override func viewDidLoad()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reloadData() + +
    +
    +
    +
    +
    +
    +

    Use this function in order to reload the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func reloadData()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You can use this function in order to scroll to the specific index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollToPage(_ pageNumber: Int, animated: Bool)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + pageNumber + + +
    +

    Page number that you want to scroll to. Friendly reminder: Sure, you already know that but anyways, this number starts with the 0(zero).

    +
    +
    + + animated + + +
    +

    Should this scrolling be animated or not?

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    We use this function to get scroll movements of our scrollview.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollViewDidScroll(_ scrollView: UIScrollView)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + scrollView + + +
    +

    UIScrollView that is currently being used.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    We use this function also to get scroll movements of our scrollview.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + scrollView + + +
    +

    UIScrollView that is currently being used.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    We use this function also to get scroll movements of our scrollview.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + scrollView + + +
    +

    UIScrollView that is currently being used.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Protocols.html b/docs/Protocols.html new file mode 100644 index 0000000..9f886e1 --- /dev/null +++ b/docs/Protocols.html @@ -0,0 +1,138 @@ + + + + Protocols Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Data source protocol for APFancyPager

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol APFancyPagerDataSource : AnyObject
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + APFancyPagerDelegate + +
    +
    +
    +
    +
    +
    +

    Delegate protocol for APFancyPager

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol APFancyPagerDelegate : AnyObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Protocols/APFancyPagerDataSource.html b/docs/Protocols/APFancyPagerDataSource.html new file mode 100644 index 0000000..42c93ec --- /dev/null +++ b/docs/Protocols/APFancyPagerDataSource.html @@ -0,0 +1,431 @@ + + + + APFancyPagerDataSource Protocol Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

APFancyPagerDataSource

+
+
+
@objc
+public protocol APFancyPagerDataSource : AnyObject
+ +
+
+

Data source protocol for APFancyPager

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the number of your view controllers that will be used in the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func numberOfViewControllers(_ fancyPagerViewController: APFancyPagerViewController) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    +
    +
    +

    Return Value

    +

    Number of view controllers that will be used in the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the view controllers that will be used in the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, viewControllerForIndex index: Int) -> UIViewController
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + viewControllerForIndex + + +
    +

    Index parameter of the view controller that will be used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    View controller that will be used in the APFancyPager

    +
    +
    +
    +
  • +
  • +
    + + + + heightForHeader(_:) + +
    +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header height of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func heightForHeader(_ fancyPagerViewController: APFancyPagerViewController) -> CGFloat
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    +
    +
    +

    Return Value

    +

    Header height of the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header string at the given index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerStringForIndex index: Int) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + headerStringForIndex + + +
    +

    Index parameter of the header that used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    Header string of the given index of the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header background color at the given index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerBackgroundColorForIndex index: Int) -> UIColor
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + headerBackgroundColorForIndex + + +
    +

    Index parameter of the header that used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    Header background color of the given index of the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header text color at the given index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerTextColorForIndex index: Int) -> UIColor
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + headerTextColorForIndex + + +
    +

    Index parameter of the header that used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    Header text color of the given index of the APFancyPager

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Protocols/APFancyPagerDelegate.html b/docs/Protocols/APFancyPagerDelegate.html new file mode 100644 index 0000000..5caf715 --- /dev/null +++ b/docs/Protocols/APFancyPagerDelegate.html @@ -0,0 +1,237 @@ + + + + APFancyPagerDelegate Protocol Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

APFancyPagerDelegate

+
+
+
@objc
+public protocol APFancyPagerDelegate : AnyObject
+ +
+
+

Delegate protocol for APFancyPager

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    You can implement this function in order to get information while the user is scrolling through the APFancyPager.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, isScrollingFromIndex fromIndex: Int, toIndex: Int, progress: CGFloat)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + isScrollingFromIndex + + +
    +

    Index parameter that user started to scrolling from in the APFancyPager.

    +
    +
    + + toIndex + + +
    +

    Index parameter that user started to scrolling to in the APFancyPager.

    +
    +
    + + progress + + +
    +

    Progress of the scrolling.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + fancyPagerViewController(_:didScrollToIndex:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    You can implement this function in order to get information when the user did scroll successfully through the APFancyPager.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, didScrollToIndex index: Int)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + didScrollToIndex + + +
    +

    Index parameter that user scrolled in the APFancyPager.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/appvideo.gif b/docs/appvideo.gif new file mode 100644 index 0000000..eabc126 Binary files /dev/null and b/docs/appvideo.gif differ diff --git a/docs/badge.svg b/docs/badge.svg new file mode 100644 index 0000000..a096fec --- /dev/null +++ b/docs/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 100% + + + 100% + + + diff --git a/docs/css/highlight.css b/docs/css/highlight.css new file mode 100644 index 0000000..d0db0e1 --- /dev/null +++ b/docs/css/highlight.css @@ -0,0 +1,200 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css new file mode 100644 index 0000000..d628282 --- /dev/null +++ b/docs/css/jazzy.css @@ -0,0 +1,337 @@ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +a { + color: #0088cc; + text-decoration: none; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 26px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 1; } + header img { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 27px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 1; + margin-top: 26px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 60px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token { + padding-left: 3px; + margin-left: 15px; + font-size: 11.9px; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: absolute; + bottom: 10px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } +html.dash .height-container { + display: block; } +html.dash .item .token { + margin-left: 0; } +html.dash .content-wrapper { + width: auto; } +html.dash #footer { + position: static; } diff --git a/docs/docsets/.docset/Contents/Info.plist b/docs/docsets/.docset/Contents/Info.plist new file mode 100644 index 0000000..61863ec --- /dev/null +++ b/docs/docsets/.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy. + CFBundleName + + DocSetPlatformFamily + + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..986542b --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,135 @@ + + + + Classes Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Our almighty class which is simply a UIViewController. Everything starts by using this view controller.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class APFancyPagerViewController : UIViewController, UIScrollViewDelegate
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Util + +
    +
    +
    +
    +
    +
    +

    There are some utility things.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class Util
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/APFancyPagerViewController.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/APFancyPagerViewController.html new file mode 100644 index 0000000..08969fc --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/APFancyPagerViewController.html @@ -0,0 +1,440 @@ + + + + APFancyPagerViewController Class Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

APFancyPagerViewController

+
+
+
open class APFancyPagerViewController : UIViewController, UIScrollViewDelegate
+ +
+
+

Our almighty class which is simply a UIViewController. Everything starts by using this view controller.

+ +
+
+
+
    +
  • +
    + + + + delegate + +
    +
    +
    +
    +
    +
    +

    Delegate variable, you don’t have to set this.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open weak var delegate: APFancyPagerDelegate?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dataSource + +
    +
    +
    +
    +
    +
    +

    Datasource variable, you have to set this.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open weak var dataSource: APFancyPagerDataSource?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(coder:) + +
    +
    +
    +
    +
    +
    +

    Some initialization codes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public required init?(coder aDecoder: NSCoder)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Still some initialization codes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + viewDidLoad() + +
    +
    +
    +
    +
    +
    +

    The viewDidLoad function that we also override from UIViewController. But you already know that.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open override func viewDidLoad()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reloadData() + +
    +
    +
    +
    +
    +
    +

    Use this function in order to reload the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func reloadData()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You can use this function in order to scroll to the specific index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollToPage(_ pageNumber: Int, animated: Bool)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + pageNumber + + +
    +

    Page number that you want to scroll to. Friendly reminder: Sure, you already know that but anyways, this number starts with the 0(zero).

    +
    +
    + + animated + + +
    +

    Should this scrolling be animated or not?

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    We use this function to get scroll movements of our scrollview.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollViewDidScroll(_ scrollView: UIScrollView)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + scrollView + + +
    +

    UIScrollView that is currently being used.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    We use this function also to get scroll movements of our scrollview.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + scrollView + + +
    +

    UIScrollView that is currently being used.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    We use this function also to get scroll movements of our scrollview.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + scrollView + + +
    +

    UIScrollView that is currently being used.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..9f886e1 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,138 @@ + + + + Protocols Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Data source protocol for APFancyPager

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol APFancyPagerDataSource : AnyObject
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + APFancyPagerDelegate + +
    +
    +
    +
    +
    +
    +

    Delegate protocol for APFancyPager

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol APFancyPagerDelegate : AnyObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/APFancyPagerDataSource.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/APFancyPagerDataSource.html new file mode 100644 index 0000000..42c93ec --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/APFancyPagerDataSource.html @@ -0,0 +1,431 @@ + + + + APFancyPagerDataSource Protocol Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

APFancyPagerDataSource

+
+
+
@objc
+public protocol APFancyPagerDataSource : AnyObject
+ +
+
+

Data source protocol for APFancyPager

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the number of your view controllers that will be used in the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func numberOfViewControllers(_ fancyPagerViewController: APFancyPagerViewController) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    +
    +
    +

    Return Value

    +

    Number of view controllers that will be used in the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the view controllers that will be used in the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, viewControllerForIndex index: Int) -> UIViewController
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + viewControllerForIndex + + +
    +

    Index parameter of the view controller that will be used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    View controller that will be used in the APFancyPager

    +
    +
    +
    +
  • +
  • +
    + + + + heightForHeader(_:) + +
    +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header height of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func heightForHeader(_ fancyPagerViewController: APFancyPagerViewController) -> CGFloat
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    +
    +
    +

    Return Value

    +

    Header height of the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header string at the given index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerStringForIndex index: Int) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + headerStringForIndex + + +
    +

    Index parameter of the header that used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    Header string of the given index of the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header background color at the given index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerBackgroundColorForIndex index: Int) -> UIColor
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + headerBackgroundColorForIndex + + +
    +

    Index parameter of the header that used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    Header background color of the given index of the APFancyPager

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    You should implement this function in order to tell the header text color at the given index of the APFancyPager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, headerTextColorForIndex index: Int) -> UIColor
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + headerTextColorForIndex + + +
    +

    Index parameter of the header that used in the APFancyPager.

    +
    +
    +
    +
    +

    Return Value

    +

    Header text color of the given index of the APFancyPager

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/APFancyPagerDelegate.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/APFancyPagerDelegate.html new file mode 100644 index 0000000..5caf715 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/APFancyPagerDelegate.html @@ -0,0 +1,237 @@ + + + + APFancyPagerDelegate Protocol Reference + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

APFancyPagerDelegate

+
+
+
@objc
+public protocol APFancyPagerDelegate : AnyObject
+ +
+
+

Delegate protocol for APFancyPager

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    You can implement this function in order to get information while the user is scrolling through the APFancyPager.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, isScrollingFromIndex fromIndex: Int, toIndex: Int, progress: CGFloat)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + isScrollingFromIndex + + +
    +

    Index parameter that user started to scrolling from in the APFancyPager.

    +
    +
    + + toIndex + + +
    +

    Index parameter that user started to scrolling to in the APFancyPager.

    +
    +
    + + progress + + +
    +

    Progress of the scrolling.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + fancyPagerViewController(_:didScrollToIndex:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    You can implement this function in order to get information when the user did scroll successfully through the APFancyPager.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func fancyPagerViewController(_ fancyPagerViewController: APFancyPagerViewController, didScrollToIndex index: Int)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fancyPagerViewController + + +
    +

    APFancyPagerViewController object of currently using.

    +
    +
    + + didScrollToIndex + + +
    +

    Index parameter that user scrolled in the APFancyPager.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/badge.svg b/docs/docsets/.docset/Contents/Resources/Documents/badge.svg new file mode 100644 index 0000000..a096fec --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 100% + + + 100% + + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..d0db0e1 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,200 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..d628282 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,337 @@ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +a { + color: #0088cc; + text-decoration: none; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 26px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 1; } + header img { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 27px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 1; + margin-top: 26px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 60px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token { + padding-left: 3px; + margin-left: 15px; + font-size: 11.9px; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: absolute; + bottom: 10px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } +html.dash .height-container { + display: block; } +html.dash .item .token { + margin-left: 0; } +html.dash .content-wrapper { + width: auto; } +html.dash #footer { + position: static; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000..29d2f7f Binary files /dev/null and b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000..6f694c7 Binary files /dev/null and b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png new file mode 100755 index 0000000..628da97 Binary files /dev/null and b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/index.html b/docs/docsets/.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..ec3ea90 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,87 @@ + + + + Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+ +

APFancyPager

+ +

A fancy pager view controller framework for Swift/Objective-C

+ +

Platform +CocoaPods +License

+

Installation

+

Cocoapods

+ +

pod 'APFancyPager'

+

Usage

+ +

You can check the demo project to get the basics of the framework.

+ +

Simply make your view controller extend APFancyPagerViewController and also implement the data source and optionally the delegate.

+

License

+ +

APFancyPager is released under the MIT license. See LICENSE for details.

+ +
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..3965b5f --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,46 @@ +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +// On doc load, toggle the URL hash discussion if present +$(document).ready(function() { + if (!window.jazzy.docset) { + var linkToHash = $('a[href="' + window.location.hash +'"]'); + linkToHash.trigger("click"); + } +}); + +// On token click, toggle its discussion and animate token.marginLeft +$(".token").click(function(event) { + if (window.jazzy.docset) { + return; + } + var link = $(this); + var animationDuration = 300; + var tokenOffset = "15px"; + var original = link.css('marginLeft') == tokenOffset; + link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); + $content = link.parent().parent().next(); + $content.slideToggle(animationDuration); + + // Keeps the document from jumping to the hash. + var href = $(this).attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Dumb down quotes within code blocks that delimit strings instead of quotations +// https://github.com/realm/jazzy/issues/714 +$("code q").replaceWith(function () { + return ["\"", $(this).contents(), "\""]; +}); diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100755 index 0000000..ab28a24 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("