diff --git a/ButtonMerchant.podspec b/ButtonMerchant.podspec index 36abbf1..6e0301e 100644 --- a/ButtonMerchant.podspec +++ b/ButtonMerchant.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ButtonMerchant' - s.version = '1.5.1' + s.version = '1.6.0' s.summary = 'An open source client library for Button merchants.' s.description = <<-DESC The Button Merchant library is a light-weight, open-source method diff --git a/ButtonMerchant.xcodeproj/project.pbxproj b/ButtonMerchant.xcodeproj/project.pbxproj index 923c953..166d4b6 100644 --- a/ButtonMerchant.xcodeproj/project.pbxproj +++ b/ButtonMerchant.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -99,7 +99,6 @@ DE1706E32085633A009FF30B /* TestDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E120856336009FF30B /* TestDevice.swift */; }; DE1706E5208563D7009FF30B /* TestLocale.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E4208563D7009FF30B /* TestLocale.swift */; }; DE1706E7208563F1009FF30B /* TestScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E6208563F1009FF30B /* TestScreen.swift */; }; - DE1706E920856417009FF30B /* TestAdIdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E820856417009FF30B /* TestAdIdManager.swift */; }; DE175A1C20A09DEA005C97B9 /* Version.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE175A1A20A09DDE005C97B9 /* Version.generated.swift */; }; DE175A2120A0AFF6005C97B9 /* VersionTests.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE175A2020A0AFF6005C97B9 /* VersionTests.generated.swift */; }; DE2F7450208F6552001E4BD6 /* ConfigurationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE2F744E208F6535001E4BD6 /* ConfigurationError.swift */; }; @@ -111,6 +110,8 @@ DE59498D28F49FA200FD9737 /* ButtonMerchantExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE59498C28F49FA200FD9737 /* ButtonMerchantExtensions.swift */; }; DE5D375328B7D173001AA004 /* Order.m in Sources */ = {isa = PBXBuildFile; fileRef = DE0F12AD28B7CD970047A61E /* Order.m */; }; DE5D375428B7D174001AA004 /* Order.m in Sources */ = {isa = PBXBuildFile; fileRef = DE0F12AD28B7CD970047A61E /* Order.m */; }; + DE74427F2A8F04DF009D6BD1 /* ButtonMerchant.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE865F842052FE5D00F4054D /* ButtonMerchant.framework */; }; + DE7442802A8F04DF009D6BD1 /* ButtonMerchant.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE865F842052FE5D00F4054D /* ButtonMerchant.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DE865F722052E79A00F4054D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE865F712052E79A00F4054D /* AppDelegate.swift */; }; DE865F8D2052FE5D00F4054D /* ButtonMerchant.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE865F842052FE5D00F4054D /* ButtonMerchant.framework */; }; DE865F962052FE5D00F4054D /* ButtonMerchant.h in Headers */ = {isa = PBXBuildFile; fileRef = DE865F862052FE5D00F4054D /* ButtonMerchant.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -159,6 +160,13 @@ remoteGlobalIDString = DE865F832052FE5D00F4054D; remoteInfo = ButtonMerchant; }; + DE7442812A8F04DF009D6BD1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE865F832052FE5D00F4054D; + remoteInfo = ButtonMerchant; + }; DE865F8E2052FE5D00F4054D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 607FACC81AFB9204008FA782 /* Project object */; @@ -168,6 +176,20 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + DE7442832A8F04DF009D6BD1 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + DE7442802A8F04DF009D6BD1 /* ButtonMerchant.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1056D6CD4EC26DA7A7B7E86D /* Pods-Example-ObjC.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ObjC.release.xcconfig"; path = "Target Support Files/Pods-Example-ObjC/Pods-Example-ObjC.release.xcconfig"; sourceTree = ""; }; 1885C61CD9A0729B7F905B78 /* Pods-UnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UnitTests.release.xcconfig"; path = "Target Support Files/Pods-UnitTests/Pods-UnitTests.release.xcconfig"; sourceTree = ""; }; @@ -275,7 +297,6 @@ DE1706E120856336009FF30B /* TestDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestDevice.swift; sourceTree = ""; }; DE1706E4208563D7009FF30B /* TestLocale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestLocale.swift; sourceTree = ""; }; DE1706E6208563F1009FF30B /* TestScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestScreen.swift; sourceTree = ""; }; - DE1706E820856417009FF30B /* TestAdIdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAdIdManager.swift; sourceTree = ""; }; DE175A1A20A09DDE005C97B9 /* Version.generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Version.generated.swift; sourceTree = ""; }; DE175A2020A0AFF6005C97B9 /* VersionTests.generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionTests.generated.swift; sourceTree = ""; }; DE2F744E208F6535001E4BD6 /* ConfigurationError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationError.swift; sourceTree = ""; }; @@ -325,6 +346,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DE74427F2A8F04DF009D6BD1 /* ButtonMerchant.framework in Frameworks */, 20B25FD4CC0EFA64DBAB0EC0 /* Pods_Example.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -544,7 +566,6 @@ 9E5475E3206D91A900947A1C /* TestURLSessionDataTask.swift */, 9EAA60C4207AC9AC00D21601 /* TestFileManager.swift */, 9EAA60C6207AC9FF00D21601 /* TestCalendar.swift */, - DE1706E820856417009FF30B /* TestAdIdManager.swift */, DE1706E120856336009FF30B /* TestDevice.swift */, DE1706E6208563F1009FF30B /* TestScreen.swift */, DE1706E4208563D7009FF30B /* TestLocale.swift */, @@ -743,11 +764,13 @@ 607FACCC1AFB9204008FA782 /* Sources */, 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, + DE7442832A8F04DF009D6BD1 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( DE18FC5B28B7E24500558C2E /* PBXTargetDependency */, + DE7442822A8F04DF009D6BD1 /* PBXTargetDependency */, ); name = Example; productName = ButtonMerchant; @@ -839,7 +862,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1500; ORGANIZATIONNAME = "Button, Inc."; TargetAttributes = { 607FACCF1AFB9204008FA782 = { @@ -1020,6 +1043,7 @@ }; DA0FA2BC2061AAD8008296A6 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1034,6 +1058,7 @@ }; DA0FA2C82062EF38008296A6 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1048,6 +1073,7 @@ }; DECAAF592065816600E2D983 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1062,6 +1088,7 @@ }; DECF9F28206B01F0009F3930 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1201,7 +1228,6 @@ DA0FA2A3205C1EF2008296A6 /* TestCore.swift in Sources */, DA29D894209CF34D00537806 /* UIDeviceTests.swift in Sources */, FBEBC92125435D5900AAE9E5 /* TestAppIntegrationVerification.swift in Sources */, - DE1706E920856417009FF30B /* TestAdIdManager.swift in Sources */, DA29D892209CDC3100537806 /* URLSessionTests.swift in Sources */, DA756B7922B2DB67003397E3 /* SessionDelegateTests.swift in Sources */, FB70030B24CF46260050E021 /* AppEventsRequestBodyTests.swift in Sources */, @@ -1260,6 +1286,11 @@ target = DE865F832052FE5D00F4054D /* ButtonMerchant */; targetProxy = DE18FC5C28B7E24900558C2E /* PBXContainerItemProxy */; }; + DE7442822A8F04DF009D6BD1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE865F832052FE5D00F4054D /* ButtonMerchant */; + targetProxy = DE7442812A8F04DF009D6BD1 /* PBXContainerItemProxy */; + }; DE865F8F2052FE5D00F4054D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DE865F832052FE5D00F4054D /* ButtonMerchant */; @@ -1406,7 +1437,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; VALIDATE_PRODUCT = YES; }; @@ -1421,7 +1453,10 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = 39F27QYP2C; INFOPLIST_FILE = "$(SRCROOT)/Examples/Swift/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1440,7 +1475,10 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = 39F27QYP2C; INFOPLIST_FILE = "$(SRCROOT)/Examples/Swift/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1466,7 +1504,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/IntegrationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.button.IntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -1492,7 +1534,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/IntegrationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.button.IntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -1518,7 +1564,10 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "$(SRCROOT)/Examples/Objective-C/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example-objc"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Examples/Objective-C/Example-ObjC-Bridging-Header.h"; @@ -1545,7 +1594,10 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "$(SRCROOT)/Examples/Objective-C/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example-objc"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Examples/Objective-C/Example-ObjC-Bridging-Header.h"; @@ -1576,7 +1628,11 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.merchant; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -1610,7 +1666,11 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.merchant; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -1638,7 +1698,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/UnitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.ButtonMerchantTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -1662,7 +1726,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/UnitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.ButtonMerchantTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme b/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme index 0bdad51..a407e80 100644 --- a/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme +++ b/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme @@ -1,6 +1,6 @@ 1.0, >= 1.0.2) @@ -9,7 +9,7 @@ GEM minitest (>= 5.1) tzinfo (~> 2.0) zeitwerk (~> 2.3) - addressable (2.8.1) + addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) @@ -17,20 +17,20 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.621.0) - aws-sdk-core (3.135.0) + aws-partitions (1.828.0) + aws-sdk-core (3.183.1) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.525.0) - aws-sigv4 (~> 1.1) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.58.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-kms (1.71.0) + aws-sdk-core (~> 3, >= 3.177.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.114.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-s3 (1.135.0) + aws-sdk-core (~> 3, >= 3.181.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.1) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.1.0) @@ -78,7 +78,7 @@ GEM highline (~> 2.0.0) concurrent-ruby (1.1.10) declarative (0.0.20) - digest-crc (0.6.4) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) @@ -87,8 +87,8 @@ GEM escape (0.0.4) ethon (0.15.0) ffi (>= 1.15.0) - excon (0.92.4) - faraday (1.10.2) + excon (0.103.0) + faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -116,8 +116,8 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.6) - fastlane (2.209.1) + fastimage (2.2.7) + fastlane (2.216.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -138,10 +138,11 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (~> 2.0.0) + multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) @@ -149,7 +150,7 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) @@ -160,9 +161,9 @@ GEM fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.25.0) - google-apis-core (>= 0.7, < 2.a) - google-apis-core (0.7.0) + google-apis-androidpublisher_v3 (0.50.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.1) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -171,30 +172,29 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.13.0) - google-apis-core (>= 0.7, < 2.a) - google-apis-playcustomapp_v1 (0.10.0) - google-apis-core (>= 0.7, < 2.a) - google-apis-storage_v1 (0.17.0) - google-apis-core (>= 0.7, < 2.a) + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.2.0) - google-cloud-storage (1.39.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.44.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.17.0) + google-apis-storage_v1 (~> 0.19.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.2.0) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -214,18 +214,17 @@ GEM sassc (~> 2.1) sqlite3 (~> 1.3) xcinvoke (~> 0.3.0) - jmespath (1.6.1) - json (2.6.2) - jwt (2.4.1) + jmespath (1.6.2) + json (2.6.3) + jwt (2.7.1) liferaft (0.0.6) - memoist (0.16.2) - mini_magick (4.11.0) - mini_mime (1.1.2) + mini_magick (4.12.0) + mini_mime (1.1.5) mini_portile2 (2.8.0) minitest (5.16.3) molinillo (0.8.0) multi_json (1.15.0) - multipart-post (2.0.0) + multipart-post (2.3.0) mustache (1.1.1) nanaimo (0.3.0) nap (1.1.0) @@ -237,7 +236,7 @@ GEM open4 (1.3.4) optparse (0.1.1) os (1.1.4) - plist (3.6.0) + plist (3.7.0) public_suffix (4.0.7) racc (1.6.0) rake (13.0.6) @@ -247,7 +246,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.2.6) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -255,12 +254,12 @@ GEM sassc (2.4.0) ffi (~> 1.9) security (0.1.3) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.8) + simctl (1.6.10) CFPropertyList naturally slather (2.7.2) @@ -271,8 +270,8 @@ GEM xcodeproj (~> 1.21) sqlite3 (1.4.4) terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.1) @@ -286,12 +285,12 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - unicode-display_width (1.8.0) - webrick (1.7.0) + unicode-display_width (2.4.2) + webrick (1.8.1) word_wrap (1.0.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.22.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) diff --git a/Podfile b/Podfile index 8dcdb5e..08d3c06 100644 --- a/Podfile +++ b/Podfile @@ -1,3 +1,5 @@ +source 'https://cdn.cocoapods.org/' + platform :ios, '9.0' use_frameworks! diff --git a/Podfile.lock b/Podfile.lock index 78ebad8..a6cb233 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -11,6 +11,6 @@ SPEC REPOS: SPEC CHECKSUMS: SwiftLint: e14651157288e9e01d6e1a71db7014fb5744a8ea -PODFILE CHECKSUM: e9cd3d2666ced63918b1c94ad12206c66e3f14c0 +PODFILE CHECKSUM: 652cb6e78be2f97c0e2a5f3885b6be555b5af666 -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.1 diff --git a/Source/ActivityRequestBody.swift b/Source/ActivityRequestBody.swift index eb832a2..0ee5203 100644 --- a/Source/ActivityRequestBody.swift +++ b/Source/ActivityRequestBody.swift @@ -25,14 +25,12 @@ import Foundation internal struct ActivityRequestBody { - let ifa: String? let attributionToken: String? let name: String let products: [ButtonProductCompatible]? var dictionaryRepresentation: [String: Any] { var dict: [String: Any?] = [ - "ifa": ifa, "btn_ref": attributionToken ] var data: [String: Any?] = ["name": name] diff --git a/Source/AppEventsRequestBody.swift b/Source/AppEventsRequestBody.swift index 6c11133..96ac6a4 100644 --- a/Source/AppEventsRequestBody.swift +++ b/Source/AppEventsRequestBody.swift @@ -25,12 +25,11 @@ import Foundation internal struct AppEventsRequestBody: Codable { - let ifa: String? let events: [AppEvent] let currentTime: String enum CodingKeys: String, CodingKey { - case ifa, events + case events case currentTime = "current_time" } } diff --git a/Source/ButtonMerchant.swift b/Source/ButtonMerchant.swift index fb1fd8c..b0b2ecc 100644 --- a/Source/ButtonMerchant.swift +++ b/Source/ButtonMerchant.swift @@ -23,7 +23,6 @@ // import UIKit -import AdSupport /** `ButtonMerchant` is the main entry point to the library. @@ -164,7 +163,7 @@ final public class ButtonMerchant: NSObject { An interface through which library features can be enabled/disabled. */ @objc public static var features: Configurable { - return core.system + return Configured() } /** @@ -179,7 +178,6 @@ final public class ButtonMerchant: NSObject { private static func createCore() -> CoreType { let system = System(fileManager: FileManager.default, calendar: Calendar.current, - adIdManager: ASIdentifierManager.shared(), device: UIDevice.current, screen: UIScreen.main, locale: NSLocale.current, @@ -215,3 +213,13 @@ extension ButtonMerchant { completion(ButtonMerchantError.trackOrderDeprecationError) } } + +private class Configured: Configurable { + /** + Deprecated. @see Configurable + */ + var includesIFA: Bool { + get { return false } + set {} + } +} diff --git a/Source/Client.swift b/Source/Client.swift index c447c5b..72936f1 100644 --- a/Source/Client.swift +++ b/Source/Client.swift @@ -58,7 +58,7 @@ internal protocol ClientType: Activity { var pendingTasks: [PendingTask] { get set } func fetchPostInstallURL(_ completion: @escaping (URL?, String?) -> Void) func reportOrder(orderRequest: ReportOrderRequestType, _ completion: ((Error?) -> Void)?) - func reportEvents(_ events: [AppEvent], ifa: String?, _ completion: ((Error?) -> Void)?) + func reportEvents(_ events: [AppEvent], _ completion: ((Error?) -> Void)?) init(session: URLSessionType, userAgent: UserAgentType, defaults: ButtonDefaultsType, system: SystemType) } @@ -111,14 +111,14 @@ internal final class Client: ClientType { } } - func reportEvents(_ events: [AppEvent], ifa: String?, _ completion: ((Error?) -> Void)?) { + func reportEvents(_ events: [AppEvent], _ completion: ((Error?) -> Void)?) { guard events.count > 0 else { if let completion = completion { completion(ButtonMerchantError.noEventsError) } return } - let body = AppEventsRequestBody(ifa: ifa, events: events, currentTime: system.currentDate.ISO8601String) + let body = AppEventsRequestBody(events: events, currentTime: system.currentDate.ISO8601String) let request = urlRequest(url: Service.appEvents.urlWith(applicationId), parameters: body.dictionaryRepresentation) enqueueRequest(request: request) { _, error in if let completion = completion { @@ -227,7 +227,7 @@ internal extension Client { } func reportActivity(_ name: String, products: [ButtonProductCompatible]?) { - let body = ActivityRequestBody(ifa: system.advertisingId, attributionToken: ButtonMerchant.attributionToken, name: name, products: products) + let body = ActivityRequestBody(attributionToken: ButtonMerchant.attributionToken, name: name, products: products) let request = urlRequest(url: Service.activity.urlWith(applicationId), parameters: body.dictionaryRepresentation) enqueueRequest(request: request) { _, _ in diff --git a/Source/Configurable.swift b/Source/Configurable.swift index 52d00af..1398182 100644 --- a/Source/Configurable.swift +++ b/Source/Configurable.swift @@ -30,9 +30,8 @@ import Foundation @objc public protocol Configurable: AnyObject { /** - Indicates whether or not the library will attach IFA to outgoing requests. - - The default value is `true`. If set to `false`, or if the user has limited IFA usage in their device settings, the IFA will not be attached. + Deprecated. This library does not read the advertising identifier even when permission is granted by the user. */ + @available(*, deprecated, message: "Advertising identifier is not accessed by this library.") var includesIFA: Bool { get set } } diff --git a/Source/Core.swift b/Source/Core.swift index 96ef5ae..101cd89 100644 --- a/Source/Core.swift +++ b/Source/Core.swift @@ -142,7 +142,7 @@ final internal class Core: CoreType { time: system.currentDate.ISO8601String, uuid: UUID().uuidString, source: .button) - client.reportEvents([event], ifa: system.advertisingId, nil) + client.reportEvents([event], nil) } private func updateAttributionIfNeeded(token: String?) { @@ -211,6 +211,6 @@ final internal class Core: CoreType { time: system.currentDate.ISO8601String, uuid: UUID().uuidString, source: .custom) - client.reportEvents([event], ifa: system.advertisingId, nil) + client.reportEvents([event], nil) } } diff --git a/Source/Info.plist b/Source/Info.plist index 79efccc..8befd8e 100644 --- a/Source/Info.plist +++ b/Source/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.5.0 + 1.6.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/Source/ReportOrderBody.swift b/Source/ReportOrderBody.swift index 62778d8..9347f7e 100644 --- a/Source/ReportOrderBody.swift +++ b/Source/ReportOrderBody.swift @@ -33,7 +33,6 @@ internal struct ReportOrderBody: Codable { let customerOrderId: String? let lineItems: [Order.LineItem]? let customer: Order.Customer? - let advertisingId: String? enum CodingKeys: String, CodingKey { case attributionToken = "btn_ref" @@ -43,7 +42,6 @@ internal struct ReportOrderBody: Codable { case customerOrderId = "customer_order_id" case lineItems = "line_items" case customer - case advertisingId = "advertising_id" } init(system: SystemType, @@ -57,7 +55,6 @@ internal struct ReportOrderBody: Codable { self.customerOrderId = order.customerOrderId self.lineItems = order.lineItems self.customer = order.customer - self.advertisingId = system.advertisingId } } diff --git a/Source/System.swift b/Source/System.swift index 706f155..b090f94 100644 --- a/Source/System.swift +++ b/Source/System.swift @@ -24,11 +24,9 @@ import UIKit -internal protocol SystemType: Configurable { +internal protocol SystemType: AnyObject { var fileManager: FileManagerType { get } var calendar: CalendarType { get } - var adIdManager: ASIdentifierManagerType { get } - var advertisingId: String? { get } var device: UIDeviceType { get } var screen: UIScreenType { get } var locale: LocaleType { get } @@ -37,7 +35,6 @@ internal protocol SystemType: Configurable { var isNewInstall: Bool { get } init(fileManager: FileManagerType, calendar: CalendarType, - adIdManager: ASIdentifierManagerType, device: UIDeviceType, screen: UIScreenType, locale: LocaleType, @@ -46,24 +43,12 @@ internal protocol SystemType: Configurable { internal final class System: SystemType { - static let allZerosPattern = "^(?:[0+\\-]+){10,}$" - - var includesIFA: Bool var fileManager: FileManagerType var calendar: CalendarType - var adIdManager: ASIdentifierManagerType var device: UIDeviceType var screen: UIScreenType var locale: LocaleType var bundle: BundleType - - var advertisingId: String? { - let ifa = self.adIdManager.advertisingIdentifier.uuidString - guard self.includesIFA && !ifa.matches(System.allZerosPattern) else { - return nil - } - return ifa - } var currentDate: Date { return Date() @@ -82,18 +67,15 @@ internal final class System: SystemType { init(fileManager: FileManagerType, calendar: CalendarType, - adIdManager: ASIdentifierManagerType, device: UIDeviceType, screen: UIScreenType, locale: LocaleType, bundle: BundleType) { self.fileManager = fileManager self.calendar = calendar - self.adIdManager = adIdManager self.device = device self.screen = screen self.locale = locale self.bundle = bundle - self.includesIFA = true } } diff --git a/Source/Version/Version.generated.swift b/Source/Version/Version.generated.swift index bc4968f..be70b0d 100644 --- a/Source/Version/Version.generated.swift +++ b/Source/Version/Version.generated.swift @@ -35,5 +35,5 @@ public struct Version { /** Library version string. */ - static let stringValue = "1.5.0" + static let stringValue = "1.6.0" } diff --git a/Tests/UnitTests/ActivityRequestBodyTests.swift b/Tests/UnitTests/ActivityRequestBodyTests.swift index d2eba0b..d0aa3d2 100644 --- a/Tests/UnitTests/ActivityRequestBodyTests.swift +++ b/Tests/UnitTests/ActivityRequestBodyTests.swift @@ -30,15 +30,14 @@ class ActivityRequestBodyTests: XCTestCase { func testInitialization_createsInstance() { let product = ButtonProduct() product.id = "some id" - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: "some srctok", name: "some name", products: [product]) + let body = ActivityRequestBody(attributionToken: "some srctok", name: "some name", products: [product]) XCTAssertNotNil(body) - XCTAssertEqual(body.ifa, "some ifa") XCTAssertEqual(body.name, "some name") XCTAssertEqual(body.products?.first?.id, "some id") } func testDictionaryRepresentation_noIFA() { - let body = ActivityRequestBody(ifa: nil, attributionToken: nil, name: "some name", products: nil) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: nil) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, ["activity_data": [ "name": "some name" @@ -46,16 +45,15 @@ class ActivityRequestBodyTests: XCTestCase { } func testDictionaryRepresentation_withIFA() { - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: nil, name: "some name", products: nil) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: nil) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, - ["ifa": "some ifa", - "activity_data": [ + ["activity_data": [ "name": "some name" ]]) } func testDictionaryRepresentation_withAttributionToken() { - let body = ActivityRequestBody(ifa: nil, attributionToken: "some srctok", name: "some name", products: nil) + let body = ActivityRequestBody(attributionToken: "some srctok", name: "some name", products: nil) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, ["btn_ref": "some srctok", "activity_data": [ @@ -64,10 +62,9 @@ class ActivityRequestBodyTests: XCTestCase { } func testDictionaryRepresentation_emptyProducts() { - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: nil, name: "some name", products: [ButtonProduct(), ButtonProduct()]) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: [ButtonProduct(), ButtonProduct()]) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, - ["ifa": "some ifa", - "activity_data": [ + ["activity_data": [ "name": "some name", "products": [[:], [:]] ]]) @@ -84,10 +81,9 @@ class ActivityRequestBodyTests: XCTestCase { product.quantity = 25 product.url = "example.com" product.attributes = ["a": "z", "b": "y"] - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: nil, name: "some name", products: [product]) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: [product]) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ - "ifa": "some ifa", "activity_data": [ "name": "some name", "products": [[ diff --git a/Tests/UnitTests/AppEventsRequestBodyTests.swift b/Tests/UnitTests/AppEventsRequestBodyTests.swift index c455c71..f5be4e9 100644 --- a/Tests/UnitTests/AppEventsRequestBodyTests.swift +++ b/Tests/UnitTests/AppEventsRequestBodyTests.swift @@ -34,9 +34,8 @@ class AppEventsRequestBodyTests: XCTestCase { time: "2019-07-25T21:30:02.844Z", uuid: "3b3024dc-e56f-412e-8015-5c2c308126fd", source: .button) - let body = AppEventsRequestBody(ifa: "some ifa", events: [event], currentTime: "some time") + let body = AppEventsRequestBody(events: [event], currentTime: "some time") - XCTAssertEqual(body.ifa, "some ifa") XCTAssertEqual(body.currentTime, "some time") XCTAssertEqual(body.events.count, 1) XCTAssertEqual(body.events.first?.name, "test-event") @@ -54,11 +53,10 @@ class AppEventsRequestBodyTests: XCTestCase { time: "2019-07-25T21:30:02.844Z", uuid: "3b3024dc-e56f-412e-8015-5c2c308126fd", source: .button) - let body = AppEventsRequestBody(ifa: "some ifa", events: [event], currentTime: "some time") + let body = AppEventsRequestBody(events: [event], currentTime: "some time") XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ - "ifa": "some ifa", "current_time": "some time", "events": [ [ @@ -79,7 +77,7 @@ class AppEventsRequestBodyTests: XCTestCase { time: "2019-07-25T21:30:02.844Z", uuid: "3b3024dc-e56f-412e-8015-5c2c308126fd", source: .button) - let body = AppEventsRequestBody(ifa: nil, events: [event], currentTime: "some time") + let body = AppEventsRequestBody(events: [event], currentTime: "some time") XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ diff --git a/Tests/UnitTests/ButtonMerchantTests.swift b/Tests/UnitTests/ButtonMerchantTests.swift index dd81d0f..d70639d 100644 --- a/Tests/UnitTests/ButtonMerchantTests.swift +++ b/Tests/UnitTests/ButtonMerchantTests.swift @@ -193,7 +193,7 @@ class ButtonMerchantTests: XCTestCase { XCTAssertFalse(ButtonMerchant.features.includesIFA) } - func testIFASetTrue() { + func testIFASetTrueRemainsFalse() { // Arrange ButtonMerchant._core = testCore @@ -201,7 +201,7 @@ class ButtonMerchantTests: XCTestCase { ButtonMerchant.features.includesIFA = true // Assert - XCTAssertTrue(ButtonMerchant.features.includesIFA) + XCTAssertFalse(ButtonMerchant.features.includesIFA) } func testActivity_returnsClient() { diff --git a/Tests/UnitTests/ClientTests.swift b/Tests/UnitTests/ClientTests.swift index 93cb334..7cef1ae 100644 --- a/Tests/UnitTests/ClientTests.swift +++ b/Tests/UnitTests/ClientTests.swift @@ -580,7 +580,7 @@ class ClientTests: XCTestCase { attributionToken: "some token", time: "some time", uuid: "some uuid", source: .button) // Act - client.reportEvents([event], ifa: "some ifa") { error in + client.reportEvents([event]) { error in let request = testSession.lastDataTask?.originalRequest! let body = try? JSONDecoder().decode(AppEventsRequestBody.self, from: request!.httpBody!) @@ -588,7 +588,6 @@ class ClientTests: XCTestCase { XCTAssertNil(error) XCTAssertEqual(request?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/events") XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ - "ifa": "some ifa", "current_time": "2019-07-25T21:30:02Z", "events": [ [ @@ -622,7 +621,7 @@ class ClientTests: XCTestCase { client.applicationId = ApplicationId("app-abc123") // Act - client.reportEvents([], ifa: "some ifa") { error in + client.reportEvents([]) { error in // Assert XCTAssertFalse(testSession.didCallDataTaskWithRequest) @@ -644,7 +643,7 @@ class ClientTests: XCTestCase { // Act client.fetchPostInstallURL { _, _ in } - client.reportEvents([event], ifa: "some ifa") { _ in } + client.reportEvents([event]) { _ in } // Assert XCTAssertEqual(client.pendingTasks.count, 2) @@ -689,7 +688,7 @@ class ClientTests: XCTestCase { system: TestSystem()) let event = AppEvent(name: "event1", value: nil, attributionToken: "some token", time: "some time", uuid: "some uuid", source: .button) client.fetchPostInstallURL { _, _ in } - client.reportEvents([event], ifa: "some ifa") { _ in } + client.reportEvents([event]) { _ in } // Act client.applicationId = ApplicationId("app-test") @@ -711,7 +710,6 @@ class ClientTests: XCTestCase { // Arrange let testURLSession = TestURLSession() let testSystem = TestSystem() - testSystem.advertisingId = "some ifa" let client = Client(session: testURLSession, userAgent: TestUserAgent(), defaults: TestButtonDefaults(userDefaults: TestUserDefaults()), @@ -727,7 +725,6 @@ class ClientTests: XCTestCase { XCTAssertEqual(task.originalRequest?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/activity") let json = try? JSONSerialization.jsonObject(with: task.originalRequest!.httpBody!) as? NSDictionary - XCTAssertEqual(json?["ifa"] as? String, "some ifa") XCTAssertEqual((json?["activity_data"] as? NSDictionary)?["name"] as? String, "product-viewed") } @@ -735,7 +732,6 @@ class ClientTests: XCTestCase { // Arrange let testURLSession = TestURLSession() let testSystem = TestSystem() - testSystem.advertisingId = "some ifa" let client = Client(session: testURLSession, userAgent: TestUserAgent(), defaults: TestButtonDefaults(userDefaults: TestUserDefaults()), @@ -751,7 +747,6 @@ class ClientTests: XCTestCase { XCTAssertEqual(task.originalRequest?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/activity") let json = try? JSONSerialization.jsonObject(with: task.originalRequest!.httpBody!) as? NSDictionary - XCTAssertEqual(json?["ifa"] as? String, "some ifa") XCTAssertEqual((json?["activity_data"] as? NSDictionary)?["name"] as? String, "add-to-cart") } @@ -759,7 +754,6 @@ class ClientTests: XCTestCase { // Arrange let testURLSession = TestURLSession() let testSystem = TestSystem() - testSystem.advertisingId = "some ifa" let client = Client(session: testURLSession, userAgent: TestUserAgent(), defaults: TestButtonDefaults(userDefaults: TestUserDefaults()), @@ -775,7 +769,6 @@ class ClientTests: XCTestCase { XCTAssertEqual(task.originalRequest?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/activity") let json = try? JSONSerialization.jsonObject(with: task.originalRequest!.httpBody!) as? NSDictionary - XCTAssertEqual(json?["ifa"] as? String, "some ifa") XCTAssertEqual((json?["activity_data"] as? NSDictionary)?["name"] as? String, "cart-viewed") } } diff --git a/Tests/UnitTests/CoreTests.swift b/Tests/UnitTests/CoreTests.swift index d022fc0..34ca225 100644 --- a/Tests/UnitTests/CoreTests.swift +++ b/Tests/UnitTests/CoreTests.swift @@ -113,7 +113,6 @@ class CoreTests: XCTestCase { func testTrackIncomingURL_withToken_tracksDeeplinkOpened() { // Arrange - testSystem.advertisingId = "some ifa" testSystem.testCurrentDate = Date.ISO8601Formatter.date(from: "2019-07-25T21:30:02Z")! let url = URL(string: "http://usebutton.com/with-token?btn_ref=faketok-abc123")! @@ -122,7 +121,6 @@ class CoreTests: XCTestCase { // Assert XCTAssertTrue(testClient.didCallReportEvents) - XCTAssertEqual(testClient.actualIFA, "some ifa") XCTAssertEqual(testClient.actualEvents?.count, 1) XCTAssertEqual(testClient.actualEvents?.first?.name, "btn:deeplink-opened") XCTAssertEqual(testClient.actualEvents?.first?.value?["url"], url.absoluteString) @@ -452,8 +450,7 @@ class CoreTests: XCTestCase { // swiftlint:disable line_length XCTAssertEqual(testClient.testReportOrderRequest!.parameters as NSDictionary, - ["advertising_id": "00000000-0000-0000-0000-000000000000", - "btn_ref": "srctok-abc123", + ["btn_ref": "srctok-abc123", "order_id": "order-abc", "currency": "USD", "purchase_date": date.ISO8601String, diff --git a/Tests/UnitTests/Extensions/UIDeviceTests.swift b/Tests/UnitTests/Extensions/UIDeviceTests.swift index 7a28378..a099b28 100644 --- a/Tests/UnitTests/Extensions/UIDeviceTests.swift +++ b/Tests/UnitTests/Extensions/UIDeviceTests.swift @@ -27,11 +27,6 @@ import XCTest class UIDeviceTests: XCTestCase { - func testModelName() { - let modelName = UIDevice.current.modelName - XCTAssertEqual(modelName, "x86_64") - } - func testMachineName() { let machineName = UIDevice.current.machineName(from: TestUTSName.systemInfo) XCTAssertEqual(machineName, "iPhone10,6") diff --git a/Tests/UnitTests/ReportOrderBodyTests.swift b/Tests/UnitTests/ReportOrderBodyTests.swift index ce2bb2f..1da4d6c 100644 --- a/Tests/UnitTests/ReportOrderBodyTests.swift +++ b/Tests/UnitTests/ReportOrderBodyTests.swift @@ -69,8 +69,7 @@ class ReportOrderBodyTests: XCTestCase { // Assert XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, - ["advertising_id": "00000000-0000-0000-0000-000000000000", - "btn_ref": "srctok-abc123", + ["btn_ref": "srctok-abc123", "order_id": "order-abc", "currency": "USD", "purchase_date": date.ISO8601String, @@ -85,7 +84,6 @@ class ReportOrderBodyTests: XCTestCase { let date: Date = Date.ISO8601Formatter.date(from: "2019-06-17T12:08:10-04:00")! let order = Order(id: "order-abc", purchaseDate: date, lineItems: []) let testSystem = TestSystem() - testSystem.advertisingId = nil // Act let body = ReportOrderBody(system: testSystem, attributionToken: "srctok-abc123", diff --git a/Tests/UnitTests/SystemTests.swift b/Tests/UnitTests/SystemTests.swift index 0ae72be..9f79b7b 100644 --- a/Tests/UnitTests/SystemTests.swift +++ b/Tests/UnitTests/SystemTests.swift @@ -29,7 +29,6 @@ class SystemTests: XCTestCase { var fileManager: TestFileManager! var calendar: TestCalendar! - var adIdManager: TestAdIdManager! var device: TestDevice! var screen: TestScreen! var locale: TestLocale! @@ -41,14 +40,12 @@ class SystemTests: XCTestCase { super.setUp() fileManager = TestFileManager() calendar = TestCalendar() - adIdManager = TestAdIdManager() device = TestDevice() screen = TestScreen() locale = TestLocale() bundle = TestBundle() system = System(fileManager: fileManager, calendar: calendar, - adIdManager: adIdManager, device: device, screen: screen, locale: locale, @@ -118,42 +115,4 @@ class SystemTests: XCTestCase { // Assert XCTAssertFalse(isNewInstall) } - - func testIFADefaultValue() { - XCTAssertTrue(system.includesIFA) - } - - func testAdvertisingId_whenValid_returnsString() { - // Arrange - adIdManager.stubbedID = .validId - XCTAssertEqual(system.advertisingId, "11111111-1111-1111-1111-111111111111") - adIdManager.stubbedID = .validIdWithLeadingZeros - XCTAssertEqual(system.advertisingId, "00000000-0011-1111-1111-111111111111") - adIdManager.stubbedID = .validIdWithMidZeros - XCTAssertEqual(system.advertisingId, "11111111-1000-0000-0001-111111111111") - adIdManager.stubbedID = .validIdWithTrailingZeros - XCTAssertEqual(system.advertisingId, "11111111-1111-1111-1111-110000000000") - } - - func testAdvertisingId_whenInvalid_returnsNil() { - // Arrange - system.adIdManager = TestAdIdManager(.invalidId) - - // Act - let advertisingId = system.advertisingId - - // Assert - XCTAssertNil(advertisingId) - } - - func testincludesIFASetToFalse() { - // Arrange - system.includesIFA = false - - // Act - let advertisingId = system.advertisingId - - // Assert - XCTAssertNil(advertisingId) - } } diff --git a/Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift b/Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift deleted file mode 100644 index badfda9..0000000 --- a/Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// TestAdIdManager.swift -// -// Copyright © 2018 Button, Inc. All rights reserved. (https://usebutton.com) -// -// 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. -// - -import UIKit -@testable import ButtonMerchant - -class TestAdIdManager: ASIdentifierManagerType { - - enum AdIDType: String { - case validId = "11111111-1111-1111-1111-111111111111" - case validIdWithLeadingZeros = "00000000-0011-1111-1111-111111111111" - case validIdWithTrailingZeros = "11111111-1111-1111-1111-110000000000" - case validIdWithMidZeros = "11111111-1000-0000-0001-111111111111" - case invalidId = "00000000-0000-0000-0000-000000000000" - } - - var stubbedID: AdIDType - - var advertisingIdentifier: UUID { - return UUID(uuidString: stubbedID.rawValue)! - } - - init(_ adIDType: AdIDType = .validId) { - stubbedID = adIDType - } -} diff --git a/Tests/UnitTests/TestObjects/TestClient.swift b/Tests/UnitTests/TestObjects/TestClient.swift index f348f8c..c77d8c8 100644 --- a/Tests/UnitTests/TestObjects/TestClient.swift +++ b/Tests/UnitTests/TestObjects/TestClient.swift @@ -52,7 +52,6 @@ class TestClient: ClientType { var reportOrderCompletion: ((Error?) -> Void)? var actualEvents: [AppEvent]? - var actualIFA: String? var actualReportEventsCompletion: ((Error?) -> Void)? var actualProduct: ButtonProductCompatible? var actualProducts: [ButtonProductCompatible]? @@ -82,10 +81,9 @@ class TestClient: ClientType { reportOrderCompletion = completion } - func reportEvents(_ events: [AppEvent], ifa: String?, _ completion: ((Error?) -> Void)?) { + func reportEvents(_ events: [AppEvent], _ completion: ((Error?) -> Void)?) { didCallReportEvents = true actualEvents = events - actualIFA = ifa actualReportEventsCompletion = completion } diff --git a/Tests/UnitTests/TestObjects/TestSystem.swift b/Tests/UnitTests/TestObjects/TestSystem.swift index 551f767..e0b6b74 100644 --- a/Tests/UnitTests/TestObjects/TestSystem.swift +++ b/Tests/UnitTests/TestObjects/TestSystem.swift @@ -32,17 +32,13 @@ final class TestSystem: SystemType { var testCurrentDate: Date // SystemType - var includesIFA: Bool var fileManager: FileManagerType var calendar: CalendarType - var adIdManager: ASIdentifierManagerType var device: UIDeviceType var screen: UIScreenType var locale: LocaleType var bundle: BundleType - var advertisingId: String? = "00000000-0000-0000-0000-000000000000" - var currentDate: Date { return testCurrentDate } @@ -53,7 +49,6 @@ final class TestSystem: SystemType { init(fileManager: FileManagerType = TestFileManager(), calendar: CalendarType = TestCalendar(), - adIdManager: ASIdentifierManagerType = TestAdIdManager(), device: UIDeviceType = TestDevice(), screen: UIScreenType = TestScreen(), locale: LocaleType = TestLocale(), @@ -65,11 +60,9 @@ final class TestSystem: SystemType { self.fileManager = fileManager self.calendar = calendar - self.adIdManager = adIdManager self.device = device self.screen = screen self.locale = locale self.bundle = bundle - self.includesIFA = true } } diff --git a/Tests/UnitTests/Version/VersionTests.generated.swift b/Tests/UnitTests/Version/VersionTests.generated.swift index e821505..c890bcd 100644 --- a/Tests/UnitTests/Version/VersionTests.generated.swift +++ b/Tests/UnitTests/Version/VersionTests.generated.swift @@ -30,11 +30,11 @@ import XCTest class VersionTests: XCTestCase { func testLibraryVersion() { - XCTAssertEqual(Version.stringValue, "1.5.0") + XCTAssertEqual(Version.stringValue, "1.6.0") } func testPlistVersion() { let libraryBundle = Bundle(for: ButtonMerchant.self) - XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.5.0") + XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.6.0") } } diff --git a/docs/history/1.6.0/Classes.html b/docs/history/1.6.0/Classes.html new file mode 100644 index 0000000..e25ab8b --- /dev/null +++ b/docs/history/1.6.0/Classes.html @@ -0,0 +1,208 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + ButtonMerchant + +
    +
    +
    +
    +
    +
    +

    ButtonMerchant is the main entry point to the library.

    + +

    To get started with your integration, +get your application Id from from the Button Dashboard. +and follow our simple integration guide

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +final public class ButtonMerchant : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ButtonProduct + +
    +
    +
    +
    +
    +
    +

    A concrete implementation of the ButtonProductCompatible protocol.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Order + +
    +
    +
    +
    +
    +
    +

    Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNOrder)
    +final public class Order : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Classes/ButtonMerchant.html b/docs/history/1.6.0/Classes/ButtonMerchant.html new file mode 100644 index 0000000..6ff0bd1 --- /dev/null +++ b/docs/history/1.6.0/Classes/ButtonMerchant.html @@ -0,0 +1,595 @@ + + + + ButtonMerchant Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchant

+
+
+ +
@objcMembers
+final public class ButtonMerchant : NSObject
+ +
+
+

ButtonMerchant is the main entry point to the library.

+ +

To get started with your integration, +get your application Id from from the Button Dashboard. +and follow our simple integration guide

+ +
+
+
+
    +
  • +
    + + + + attributionToken + +
    +
    +
    +
    +
    +
    +

    The last tracked attributionToken from an inbound Button attributed URL.

    +
    +

    Attention

    + > For attribution to work correctly, you must: + +
      +
    • Always access this token directly—never cache it.
    • +
    • Never manage the lifecycle of this token—Button manages the token validity window server-side.
    • +
    • Always include this value when reporting orders to your order API
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var attributionToken: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Configures ButtonMerchant with your application Id.

    +
    +

    Note

    +

    Note:

    + +
    +

    Get your application Id from from the Button Dashboard

    +
    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func configure(applicationId: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + applicationId + + +
    +

    Your application Id (required)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + trackIncomingURL(_:) + +
    +
    +
    +
    +
    +
    +

    Checks the passed URL for a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    Attention:

    + +
    +

    To correctly attribute customers, you must call this method with every +incoming url and userActivity from the following UIApplicationDelegate methods:

    +
    + +
      +
    • application(_:open:options:)

    • +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingURL(_ url: URL)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + url + + +
    +

    A URL that has entered your app from a third party source.

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

    Checks the URL in the passed NSUserActivity for a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    Attention:

    + +
    +

    To correctly attribute customers, you must call this method with every +incoming userActivity from the following UIApplicationDelegate method:

    +
    + +
      +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingUserActivity(_ userActivity: NSUserActivity)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userActivity + + +
    +

    A NSUserActivity with which your app has been continued.

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

    Checks to see if the user visited a url prior to installing your app.

    + +

    If a url is found, your completion handler will be called with the url and you are responsible +for navigating the user to the relevant content in your app. If a url is not found or an error occurs, your +completion handler will be called without a url and you can continue with your normal launch sequence.

    +
    +

    Attention

    +

    Attention:

    + +
    +

    This method checks for a post-install url exactly one time after a user has installed your app. +Subsequent calls will result in your completion handler being called without a url. You do not need to wait +for the completion handler before continuing with your normal launch sequence but you should be prepared +to handle a post-install url if one is found. All subsequent incoming urls will be routed to your +UIApplicationDelegate as usual.

    +
    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func handlePostInstallURL(_ completion: @escaping (URL?, Error?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + completion + + +
    +

    A completion block taking an optional url and optional error.

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

    Reports an order to Button.

    + +

    See also: Reporting Orders to Button +(docs)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func reportOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + order + + +
    +

    Your order object to be reported.

    +
    +
    + + completion + + +
    +

    An optional completion block taking an optional error.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + clearAllData() + +
    +
    +
    +
    +
    +
    +

    Discards the current session and all persisted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func clearAllData()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + features + +
    +
    +
    +
    +
    +
    +

    An interface through which library features can be enabled/disabled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var features: Configurable { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + activity + +
    +
    +
    +
    +
    +
    +

    An interface through which user activity can be reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var activity: Activity { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

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

    Deprecated.

    + +

    This method is deprecated and will be removed in a future version. It is safe to remove your usage of this method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "No longer supported. You can safely remove your usage of this method.")
    +@objc
    +public static func trackOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Classes/ButtonProduct.html b/docs/history/1.6.0/Classes/ButtonProduct.html new file mode 100644 index 0000000..73be652 --- /dev/null +++ b/docs/history/1.6.0/Classes/ButtonProduct.html @@ -0,0 +1,358 @@ + + + + ButtonProduct Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonProduct

+
+
+ +
final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
+ +
+
+

A concrete implementation of the ButtonProductCompatible protocol.

+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var id: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var categories: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var name: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currency: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var url: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Classes/Order.html b/docs/history/1.6.0/Classes/Order.html new file mode 100644 index 0000000..02af6c5 --- /dev/null +++ b/docs/history/1.6.0/Classes/Order.html @@ -0,0 +1,345 @@ + + + + Order Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Order

+
+
+ +
@objcMembers
+@objc(BTNOrder)
+final public class Order : NSObject, Codable
+ +
+
+

Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

+ +
+
+
+
    +
  • +
    + + + + currencyCode + +
    +
    +
    +
    +
    +
    +

    The ISO 4217 currency code (default is USD).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currencyCode: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customerOrderId + +
    +
    +
    +
    +
    +
    +

    The customer-facing order id.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customerOrderId: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customer + +
    +
    +
    +
    +
    +
    +

    The customer related to the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customer: Customer?
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes an order object with the passed parameters.

    + +
      +
    • id: The order identifier (required).
    • +
    • purchaseDate: The date of the purchase for the order.
    • +
    • lineItems: A list of the line item details that comprise the order.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, purchaseDate: Date, lineItems: [LineItem])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Customer + +
    +
    +
    +
    +
    +
    +

    Represents a customer in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNCustomer)
    +final public class Customer : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LineItem + +
    +
    +
    +
    +
    +
    +

    Represents a line item in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(LineItem)
    +final public class LineItem : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

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

    Deprecated.

    + +

    If you’re migrating to client side order reporting, please use init(id:purchaseDate:lineItems:) instead.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use init(id:purchaseDate:lineItems:﹚ instead")
    +@objc
    +public init(id: String, amount: Int64 = 0, currencyCode: String = "USD")
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Classes/Order/Customer.html b/docs/history/1.6.0/Classes/Order/Customer.html new file mode 100644 index 0000000..e27f88d --- /dev/null +++ b/docs/history/1.6.0/Classes/Order/Customer.html @@ -0,0 +1,215 @@ + + + + Customer Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Customer

+
+
+ +
@objcMembers
+@objc(BTNCustomer)
+final public class Customer : NSObject, Codable
+ +
+
+

Represents a customer in the order.

+ +
+
+
+
    +
  • +
    + + + + email + +
    +
    +
    +
    +
    +
    +

    The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

    + +

    Note: The value of the e-mail address must be converted to lowercase before +computing the hash. The hash itself may use uppercase or lowercase hex characters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var email: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isNew + +
    +
    +
    +
    +
    +
    +

    A flag indicating whether the customer is new (or not).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isNew: Bool?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:) + +
    +
    +
    +
    +
    +
    +

    Initializes a customer object with the passed parameters.

    + +
      +
    • id: The id for your customer (required).
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Classes/Order/LineItem.html b/docs/history/1.6.0/Classes/Order/LineItem.html new file mode 100644 index 0000000..9075bcd --- /dev/null +++ b/docs/history/1.6.0/Classes/Order/LineItem.html @@ -0,0 +1,350 @@ + + + + LineItem Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

LineItem

+
+
+ +
@objcMembers
+@objc(LineItem)
+final public class LineItem : NSObject, Codable
+ +
+
+

Represents a line item in the order.

+ +
+
+
+
    +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The number of unique units represented by this line item (default is 1).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + itemDescription + +
    +
    +
    +
    +
    +
    +

    Text describing the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var itemDescription: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sku + +
    +
    +
    +
    +
    +
    +

    The Stock Keeping Unit of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sku: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The Universal Product Code of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + category + +
    +
    +
    +
    +
    +
    +

    The category of the line item. +An ordered list of strings, starting with the topmost (or most general) category.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var category: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    A key/value store for strings to specify additional information about a line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:total:) + +
    +
    +
    +
    +
    +
    +

    An array of the line item details that comprise the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, total: Int64)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + id + + +
    +

    The unique identifier for this line item, within the scope of this order. + This must be unique across all line-items within the order. + We suggest using the SKU or UPC of the product. (required)

    +
    +
    + + total + + +
    +

    The total price of all items bought in a particular line item. (required)

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Enums.html b/docs/history/1.6.0/Enums.html new file mode 100644 index 0000000..f7bc5ba --- /dev/null +++ b/docs/history/1.6.0/Enums.html @@ -0,0 +1,204 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + ButtonMerchantError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Errors.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ButtonMerchantError : Error
    +
    extension ButtonMerchantError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ConfigurationError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConfigurationError : Error
    +
    extension ConfigurationError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NetworkError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum NetworkError : Error
    +
    extension NetworkError: Equatable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Enums/ButtonMerchantError.html b/docs/history/1.6.0/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..df5daca --- /dev/null +++ b/docs/history/1.6.0/Enums/ButtonMerchantError.html @@ -0,0 +1,179 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchantError

+
+
+ +
public enum ButtonMerchantError : Error
+
extension ButtonMerchantError: Equatable
+ +
+
+

Button Merchant Library Errors.

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

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trackOrderDeprecationError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noEventsError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noEventsError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Enums/ConfigurationError.html b/docs/history/1.6.0/Enums/ConfigurationError.html new file mode 100644 index 0000000..4d71f73 --- /dev/null +++ b/docs/history/1.6.0/Enums/ConfigurationError.html @@ -0,0 +1,184 @@ + + + + ConfigurationError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ConfigurationError

+
+
+ +
public enum ConfigurationError : Error
+
extension ConfigurationError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+
+
    +
  • +
    + + + + noApplicationId + +
    +
    +
    +
    +
    +
    +

    Library is not configured with an applicationId

    +
    +

    Note

    + Get your application Id from from the Button Dashboard + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noApplicationId
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidApplicationId(appicationId: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Enums/NetworkError.html b/docs/history/1.6.0/Enums/NetworkError.html new file mode 100644 index 0000000..bb22a57 --- /dev/null +++ b/docs/history/1.6.0/Enums/NetworkError.html @@ -0,0 +1,152 @@ + + + + NetworkError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

NetworkError

+
+
+ +
public enum NetworkError : Error
+
extension NetworkError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+
+
    +
  • +
    + + + + unknown + +
    +
    +
    +
    +
    +
    +

    There was an unknown network error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknown
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Protocols.html b/docs/history/1.6.0/Protocols.html new file mode 100644 index 0000000..0eabce7 --- /dev/null +++ b/docs/history/1.6.0/Protocols.html @@ -0,0 +1,204 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + Activity + +
    +
    +
    +
    +
    +
    +

    A protocol through which user activities can be reported.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Activity
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A protocol that defines the product properties that may be provided when reporting user activity.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol ButtonProductCompatible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Configurable + +
    +
    +
    +
    +
    +
    +

    An interface through which library features can be enabled/disabled.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Configurable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Protocols/Activity.html b/docs/history/1.6.0/Protocols/Activity.html new file mode 100644 index 0000000..8141dec --- /dev/null +++ b/docs/history/1.6.0/Protocols/Activity.html @@ -0,0 +1,218 @@ + + + + Activity Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Activity

+
+
+ +
@objc
+public protocol Activity
+ +
+
+

A protocol through which user activities can be reported.

+ +
+
+
+
    +
  • +
    + + + + productViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user has viewed a product.

    + +
      +
    • product: The product being viewed.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productViewed(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Report that the user added a product to their cart.

    + +
      +
    • product: The product added to the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productAddedToCart(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cartViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user viewed their cart.

    + +
      +
    • products: The list of products in the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cartViewed(_ products: [ButtonProductCompatible]?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Protocols/ButtonProductCompatible.html b/docs/history/1.6.0/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..5f641b3 --- /dev/null +++ b/docs/history/1.6.0/Protocols/ButtonProductCompatible.html @@ -0,0 +1,368 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonProductCompatible

+
+
+ +
@objc
+public protocol ButtonProductCompatible
+ +
+
+

A protocol that defines the product properties that may be provided when reporting user activity.

+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    +

    The product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var id: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The UPC (Universal Product Code) of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var upc: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    +

    A flat array of the names of the categories to which the product belongs.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var categories: [String]? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    +

    The name of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var name: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    +

    The ISO-4217 currency code in which the product’s value is reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var currency: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var value: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The quantity of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var quantity: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var url: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    Any additional attributes to be included with the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var attributes: [String : String]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Protocols/Configurable.html b/docs/history/1.6.0/Protocols/Configurable.html new file mode 100644 index 0000000..25d70b8 --- /dev/null +++ b/docs/history/1.6.0/Protocols/Configurable.html @@ -0,0 +1,153 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Configurable

+
+
+ +
@objc
+public protocol Configurable
+ +
+
+

An interface through which library features can be enabled/disabled.

+ +
+
+
+
    +
  • +
    + + + + includesIFA + +
    +
    +
    +
    +
    +
    +

    Deprecated. This library does not read the advertising identifier even when premission is granted by the user.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Advertising identifier is not accessed by this library.")
    +var includesIFA: Bool { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Structs.html b/docs/history/1.6.0/Structs.html new file mode 100644 index 0000000..4a507f0 --- /dev/null +++ b/docs/history/1.6.0/Structs.html @@ -0,0 +1,149 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + Version + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Version.

    +
    +

    Note

    + The Button Merchant Library follows Semantic Versioning + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Version
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/badge.svg b/docs/history/1.6.0/badge.svg new file mode 100644 index 0000000..19d671e --- /dev/null +++ b/docs/history/1.6.0/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 95% + + + 95% + + + diff --git a/docs/history/1.6.0/css/highlight.css b/docs/history/1.6.0/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.6.0/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.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/history/1.6.0/css/jazzy.css b/docs/history/1.6.0/css/jazzy.css new file mode 100644 index 0000000..2e38713 --- /dev/null +++ b/docs/history/1.6.0/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +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; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +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; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + 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: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #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: 20px; + 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; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.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 { + margin-top: 10px; + 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; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.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, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .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, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .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: relative; + top: 10px; + bottom: 0px; + 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; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Info.plist b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Info.plist new file mode 100644 index 0000000..49cb17c --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy.buttonmerchant + CFBundleName + ButtonMerchant + DocSetPlatformFamily + buttonmerchant + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..e25ab8b --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,208 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + ButtonMerchant + +
    +
    +
    +
    +
    +
    +

    ButtonMerchant is the main entry point to the library.

    + +

    To get started with your integration, +get your application Id from from the Button Dashboard. +and follow our simple integration guide

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +final public class ButtonMerchant : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ButtonProduct + +
    +
    +
    +
    +
    +
    +

    A concrete implementation of the ButtonProductCompatible protocol.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Order + +
    +
    +
    +
    +
    +
    +

    Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNOrder)
    +final public class Order : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html new file mode 100644 index 0000000..6ff0bd1 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html @@ -0,0 +1,595 @@ + + + + ButtonMerchant Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchant

+
+
+ +
@objcMembers
+final public class ButtonMerchant : NSObject
+ +
+
+

ButtonMerchant is the main entry point to the library.

+ +

To get started with your integration, +get your application Id from from the Button Dashboard. +and follow our simple integration guide

+ +
+
+
+
    +
  • +
    + + + + attributionToken + +
    +
    +
    +
    +
    +
    +

    The last tracked attributionToken from an inbound Button attributed URL.

    +
    +

    Attention

    + > For attribution to work correctly, you must: + +
      +
    • Always access this token directly—never cache it.
    • +
    • Never manage the lifecycle of this token—Button manages the token validity window server-side.
    • +
    • Always include this value when reporting orders to your order API
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var attributionToken: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Configures ButtonMerchant with your application Id.

    +
    +

    Note

    +

    Note:

    + +
    +

    Get your application Id from from the Button Dashboard

    +
    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func configure(applicationId: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + applicationId + + +
    +

    Your application Id (required)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + trackIncomingURL(_:) + +
    +
    +
    +
    +
    +
    +

    Checks the passed URL for a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    Attention:

    + +
    +

    To correctly attribute customers, you must call this method with every +incoming url and userActivity from the following UIApplicationDelegate methods:

    +
    + +
      +
    • application(_:open:options:)

    • +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingURL(_ url: URL)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + url + + +
    +

    A URL that has entered your app from a third party source.

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

    Checks the URL in the passed NSUserActivity for a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    Attention:

    + +
    +

    To correctly attribute customers, you must call this method with every +incoming userActivity from the following UIApplicationDelegate method:

    +
    + +
      +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingUserActivity(_ userActivity: NSUserActivity)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userActivity + + +
    +

    A NSUserActivity with which your app has been continued.

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

    Checks to see if the user visited a url prior to installing your app.

    + +

    If a url is found, your completion handler will be called with the url and you are responsible +for navigating the user to the relevant content in your app. If a url is not found or an error occurs, your +completion handler will be called without a url and you can continue with your normal launch sequence.

    +
    +

    Attention

    +

    Attention:

    + +
    +

    This method checks for a post-install url exactly one time after a user has installed your app. +Subsequent calls will result in your completion handler being called without a url. You do not need to wait +for the completion handler before continuing with your normal launch sequence but you should be prepared +to handle a post-install url if one is found. All subsequent incoming urls will be routed to your +UIApplicationDelegate as usual.

    +
    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func handlePostInstallURL(_ completion: @escaping (URL?, Error?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + completion + + +
    +

    A completion block taking an optional url and optional error.

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

    Reports an order to Button.

    + +

    See also: Reporting Orders to Button +(docs)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func reportOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + order + + +
    +

    Your order object to be reported.

    +
    +
    + + completion + + +
    +

    An optional completion block taking an optional error.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + clearAllData() + +
    +
    +
    +
    +
    +
    +

    Discards the current session and all persisted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func clearAllData()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + features + +
    +
    +
    +
    +
    +
    +

    An interface through which library features can be enabled/disabled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var features: Configurable { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + activity + +
    +
    +
    +
    +
    +
    +

    An interface through which user activity can be reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var activity: Activity { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

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

    Deprecated.

    + +

    This method is deprecated and will be removed in a future version. It is safe to remove your usage of this method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "No longer supported. You can safely remove your usage of this method.")
    +@objc
    +public static func trackOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html new file mode 100644 index 0000000..73be652 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html @@ -0,0 +1,358 @@ + + + + ButtonProduct Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonProduct

+
+
+ +
final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
+ +
+
+

A concrete implementation of the ButtonProductCompatible protocol.

+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var id: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var categories: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var name: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currency: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var url: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html new file mode 100644 index 0000000..02af6c5 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html @@ -0,0 +1,345 @@ + + + + Order Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Order

+
+
+ +
@objcMembers
+@objc(BTNOrder)
+final public class Order : NSObject, Codable
+ +
+
+

Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

+ +
+
+
+
    +
  • +
    + + + + currencyCode + +
    +
    +
    +
    +
    +
    +

    The ISO 4217 currency code (default is USD).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currencyCode: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customerOrderId + +
    +
    +
    +
    +
    +
    +

    The customer-facing order id.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customerOrderId: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customer + +
    +
    +
    +
    +
    +
    +

    The customer related to the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customer: Customer?
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes an order object with the passed parameters.

    + +
      +
    • id: The order identifier (required).
    • +
    • purchaseDate: The date of the purchase for the order.
    • +
    • lineItems: A list of the line item details that comprise the order.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, purchaseDate: Date, lineItems: [LineItem])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Customer + +
    +
    +
    +
    +
    +
    +

    Represents a customer in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNCustomer)
    +final public class Customer : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LineItem + +
    +
    +
    +
    +
    +
    +

    Represents a line item in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(LineItem)
    +final public class LineItem : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

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

    Deprecated.

    + +

    If you’re migrating to client side order reporting, please use init(id:purchaseDate:lineItems:) instead.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use init(id:purchaseDate:lineItems:﹚ instead")
    +@objc
    +public init(id: String, amount: Int64 = 0, currencyCode: String = "USD")
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html new file mode 100644 index 0000000..e27f88d --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html @@ -0,0 +1,215 @@ + + + + Customer Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Customer

+
+
+ +
@objcMembers
+@objc(BTNCustomer)
+final public class Customer : NSObject, Codable
+ +
+
+

Represents a customer in the order.

+ +
+
+
+
    +
  • +
    + + + + email + +
    +
    +
    +
    +
    +
    +

    The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

    + +

    Note: The value of the e-mail address must be converted to lowercase before +computing the hash. The hash itself may use uppercase or lowercase hex characters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var email: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isNew + +
    +
    +
    +
    +
    +
    +

    A flag indicating whether the customer is new (or not).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isNew: Bool?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:) + +
    +
    +
    +
    +
    +
    +

    Initializes a customer object with the passed parameters.

    + +
      +
    • id: The id for your customer (required).
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html new file mode 100644 index 0000000..9075bcd --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html @@ -0,0 +1,350 @@ + + + + LineItem Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

LineItem

+
+
+ +
@objcMembers
+@objc(LineItem)
+final public class LineItem : NSObject, Codable
+ +
+
+

Represents a line item in the order.

+ +
+
+
+
    +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The number of unique units represented by this line item (default is 1).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + itemDescription + +
    +
    +
    +
    +
    +
    +

    Text describing the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var itemDescription: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sku + +
    +
    +
    +
    +
    +
    +

    The Stock Keeping Unit of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sku: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The Universal Product Code of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + category + +
    +
    +
    +
    +
    +
    +

    The category of the line item. +An ordered list of strings, starting with the topmost (or most general) category.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var category: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    A key/value store for strings to specify additional information about a line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:total:) + +
    +
    +
    +
    +
    +
    +

    An array of the line item details that comprise the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, total: Int64)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + id + + +
    +

    The unique identifier for this line item, within the scope of this order. + This must be unique across all line-items within the order. + We suggest using the SKU or UPC of the product. (required)

    +
    +
    + + total + + +
    +

    The total price of all items bought in a particular line item. (required)

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..f7bc5ba --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,204 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + ButtonMerchantError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Errors.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ButtonMerchantError : Error
    +
    extension ButtonMerchantError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ConfigurationError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConfigurationError : Error
    +
    extension ConfigurationError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NetworkError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum NetworkError : Error
    +
    extension NetworkError: Equatable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..df5daca --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html @@ -0,0 +1,179 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchantError

+
+
+ +
public enum ButtonMerchantError : Error
+
extension ButtonMerchantError: Equatable
+ +
+
+

Button Merchant Library Errors.

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

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trackOrderDeprecationError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noEventsError + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noEventsError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html new file mode 100644 index 0000000..4d71f73 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html @@ -0,0 +1,184 @@ + + + + ConfigurationError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ConfigurationError

+
+
+ +
public enum ConfigurationError : Error
+
extension ConfigurationError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+
+
    +
  • +
    + + + + noApplicationId + +
    +
    +
    +
    +
    +
    +

    Library is not configured with an applicationId

    +
    +

    Note

    + Get your application Id from from the Button Dashboard + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noApplicationId
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidApplicationId(appicationId: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html new file mode 100644 index 0000000..bb22a57 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html @@ -0,0 +1,152 @@ + + + + NetworkError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

NetworkError

+
+
+ +
public enum NetworkError : Error
+
extension NetworkError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+
+
    +
  • +
    + + + + unknown + +
    +
    +
    +
    +
    +
    +

    There was an unknown network error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknown
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..0eabce7 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,204 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + Activity + +
    +
    +
    +
    +
    +
    +

    A protocol through which user activities can be reported.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Activity
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A protocol that defines the product properties that may be provided when reporting user activity.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol ButtonProductCompatible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Configurable + +
    +
    +
    +
    +
    +
    +

    An interface through which library features can be enabled/disabled.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Configurable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html new file mode 100644 index 0000000..8141dec --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html @@ -0,0 +1,218 @@ + + + + Activity Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Activity

+
+
+ +
@objc
+public protocol Activity
+ +
+
+

A protocol through which user activities can be reported.

+ +
+
+
+
    +
  • +
    + + + + productViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user has viewed a product.

    + +
      +
    • product: The product being viewed.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productViewed(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Report that the user added a product to their cart.

    + +
      +
    • product: The product added to the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productAddedToCart(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cartViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user viewed their cart.

    + +
      +
    • products: The list of products in the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cartViewed(_ products: [ButtonProductCompatible]?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..5f641b3 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html @@ -0,0 +1,368 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonProductCompatible

+
+
+ +
@objc
+public protocol ButtonProductCompatible
+ +
+
+

A protocol that defines the product properties that may be provided when reporting user activity.

+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    +

    The product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var id: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The UPC (Universal Product Code) of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var upc: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    +

    A flat array of the names of the categories to which the product belongs.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var categories: [String]? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    +

    The name of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var name: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    +

    The ISO-4217 currency code in which the product’s value is reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var currency: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var value: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The quantity of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var quantity: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var url: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    Any additional attributes to be included with the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var attributes: [String : String]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html new file mode 100644 index 0000000..25d70b8 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html @@ -0,0 +1,153 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Configurable

+
+
+ +
@objc
+public protocol Configurable
+ +
+
+

An interface through which library features can be enabled/disabled.

+ +
+
+
+
    +
  • +
    + + + + includesIFA + +
    +
    +
    +
    +
    +
    +

    Deprecated. This library does not read the advertising identifier even when premission is granted by the user.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Advertising identifier is not accessed by this library.")
    +var includesIFA: Bool { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 0000000..4a507f0 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,149 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + Version + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Version.

    +
    +

    Note

    + The Button Merchant Library follows Semantic Versioning + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Version
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.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/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..2e38713 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +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; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +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; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + 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: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #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: 20px; + 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; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.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 { + margin-top: 10px; + 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; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.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, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .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, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .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: relative; + top: 10px; + bottom: 0px; + 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; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000..29d2f7f Binary files /dev/null and b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png differ diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000..6f694c7 Binary files /dev/null and b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png differ diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/spinner.gif b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/spinner.gif new file mode 100644 index 0000000..e3038d0 Binary files /dev/null and b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/spinner.gif differ diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..c313d5a --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,156 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Button Merchant Library

+ +

License: MIT +Coverage Status +Version +Platform

+

Documentation

+ +

Documentation for the Merchant Library can be found on the Button Developer site.

+ +

Reference docs are also available.

+

Example

+ +

To run the example project, clone the repo, run pod install, and run the Example scheme.

+

Installation

+ +

ButtonMerchant is available through CocoaPods and Carthage.

+

Swift Pacakage Manager

+ +

In Xcode, navigate to File → Swift Packages → Add Package Dependency

+ +

Enter the package repository URL:

+ +

https://github.com/button/button-merchant-ios

+ +

Note: Ensure to select ‘Up to Next Major’ version when prompted.

+

CocoaPods

+ +

Add this line to your Podfile:

+
pod 'ButtonMerchant'
+
+

Carthage

+ +

Or, add this to your Cartfile:

+
github "button/button-merchant-ios" ~> 1.0
+
+

Author

+ +

Button, Inc.

+

License

+ +

ButtonMerchant is available under the MIT license. See the LICENSE file for more info.

+

Contributing

+ +

We are looking forward to accepting your contributions to this project very soon!

+ +

Until then, if you have something you would like to contribute, please get in touch.

+ +
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +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 +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),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("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json new file mode 100644 index 0000000..a80e836 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Structs.html#/s:14ButtonMerchant7VersionV":{"name":"Version","abstract":"

Button Merchant Library Version.

"},"Protocols/Configurable.html#/c:@M@ButtonMerchant@objc(pl)Configurable(py)includesIFA":{"name":"includesIFA","abstract":"

Deprecated. This library does not read the advertising identifier even when premission is granted by the user.

","parent_name":"Configurable"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","abstract":"

The product identifier.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","abstract":"

The UPC (Universal Product Code) of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","abstract":"

A flat array of the names of the categories to which the product belongs.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","abstract":"

The name of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","abstract":"

The ISO-4217 currency code in which the product’s value is reported.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","abstract":"

The value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","abstract":"

The quantity of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","abstract":"

The URL of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","abstract":"

Any additional attributes to be included with the product.

","parent_name":"ButtonProductCompatible"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productViewed:":{"name":"productViewed(_:)","abstract":"

Report that the user has viewed a product.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productAddedToCart:":{"name":"productAddedToCart(_:)","abstract":"

Report that the user added a product to their cart.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)cartViewed:":{"name":"cartViewed(_:)","abstract":"

Report that the user viewed their cart.

","parent_name":"Activity"},"Protocols/Activity.html":{"name":"Activity","abstract":"

A protocol through which user activities can be reported.

"},"Protocols/ButtonProductCompatible.html":{"name":"ButtonProductCompatible","abstract":"

A protocol that defines the product properties that may be provided when reporting user activity.

"},"Protocols/Configurable.html":{"name":"Configurable","abstract":"

An interface through which library features can be enabled/disabled.

"},"Enums/NetworkError.html#/s:14ButtonMerchant12NetworkErrorO7unknownyA2CmF":{"name":"unknown","abstract":"

There was an unknown network error.

","parent_name":"NetworkError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO15noApplicationIdyA2CmF":{"name":"noApplicationId","abstract":"

Library is not configured with an applicationId

","parent_name":"ConfigurationError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO20invalidApplicationIdyACSS_tcACmF":{"name":"invalidApplicationId(appicationId:)","abstract":"

Undocumented

","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"

Button Merchant Library Errors.

"},"Enums/ConfigurationError.html":{"name":"ConfigurationError","abstract":"

Button Merchant Library Configuration Error.

"},"Enums/NetworkError.html":{"name":"NetworkError","abstract":"

Button Merchant Library Configuration Error.

"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8quantitySivp":{"name":"quantity","abstract":"

The number of unique units represented by this line item (default is 1).

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC15itemDescriptionSSSgvp":{"name":"itemDescription","abstract":"

Text describing the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3skuSSSgvp":{"name":"sku","abstract":"

The Stock Keeping Unit of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3upcSSSgvp":{"name":"upc","abstract":"

The Universal Product Code of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8categorySaySSGSgvp":{"name":"category","abstract":"

The category of the line item.","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC10attributesSDyS2SGSgvp":{"name":"attributes","abstract":"

A key/value store for strings to specify additional information about a line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC2id5totalAESS_s5Int64Vtcfc":{"name":"init(id:total:)","abstract":"

An array of the line item details that comprise the order

","parent_name":"LineItem"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5emailSSSgvp":{"name":"email","abstract":"

The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5isNewSbSgvp":{"name":"isNew","abstract":"

A flag indicating whether the customer is new (or not).

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC2idAESS_tcfc":{"name":"init(id:)","abstract":"

Initializes a customer object with the passed parameters.

","parent_name":"Customer"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)currencyCode":{"name":"currencyCode","abstract":"

The ISO 4217 currency code (default is USD).

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customerOrderId":{"name":"customerOrderId","abstract":"

The customer-facing order id.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customer":{"name":"customer","abstract":"

The customer related to the order

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:purchaseDate:lineItems:":{"name":"init(id:purchaseDate:lineItems:)","abstract":"

Initializes an order object with the passed parameters.

","parent_name":"Order"},"Classes/Order/Customer.html":{"name":"Customer","abstract":"

Represents a customer in the order.

","parent_name":"Order"},"Classes/Order/LineItem.html":{"name":"LineItem","abstract":"

Represents a line item in the order.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:amount:currencyCode:":{"name":"init(id:amount:currencyCode:)","abstract":"

Deprecated.

","parent_name":"Order"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","parent_name":"ButtonProduct"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)attributionToken":{"name":"attributionToken","abstract":"

The last tracked attributionToken from an inbound Button attributed URL.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)configureWithApplicationId:":{"name":"configure(applicationId:)","abstract":"

Configures ButtonMerchant with your application Id.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingURL:":{"name":"trackIncomingURL(_:)","abstract":"

Checks the passed URL for a Button attribution and if present stores the token.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingUserActivity:":{"name":"trackIncomingUserActivity(_:)","abstract":"

Checks the URL in the passed NSUserActivity for a Button attribution and if present stores the token.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)handlePostInstallURL:":{"name":"handlePostInstallURL(_:)","abstract":"

Checks to see if the user visited a url prior to installing your app.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)reportOrder:completion:":{"name":"reportOrder(_:completion:)","abstract":"

Reports an order to Button.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)clearAllData":{"name":"clearAllData()","abstract":"

Discards the current session and all persisted data.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)features":{"name":"features","abstract":"

An interface through which library features can be enabled/disabled.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)activity":{"name":"activity","abstract":"

An interface through which user activity can be reported.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@CM@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackOrder:completion:":{"name":"trackOrder(_:completion:)","abstract":"

Deprecated.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html":{"name":"ButtonMerchant","abstract":"

ButtonMerchant is the main entry point to the library.

"},"Classes/ButtonProduct.html":{"name":"ButtonProduct","abstract":"

A concrete implementation of the ButtonProductCompatible protocol.

"},"Classes/Order.html":{"name":"Order","abstract":"

Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000..a2556db Binary files /dev/null and b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx differ diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.tgz b/docs/history/1.6.0/docsets/ButtonMerchant.tgz new file mode 100644 index 0000000..ffa8f26 Binary files /dev/null and b/docs/history/1.6.0/docsets/ButtonMerchant.tgz differ diff --git a/docs/history/1.6.0/img/carat.png b/docs/history/1.6.0/img/carat.png new file mode 100755 index 0000000..29d2f7f Binary files /dev/null and b/docs/history/1.6.0/img/carat.png differ diff --git a/docs/history/1.6.0/img/dash.png b/docs/history/1.6.0/img/dash.png new file mode 100755 index 0000000..6f694c7 Binary files /dev/null and b/docs/history/1.6.0/img/dash.png differ diff --git a/docs/history/1.6.0/img/spinner.gif b/docs/history/1.6.0/img/spinner.gif new file mode 100644 index 0000000..e3038d0 Binary files /dev/null and b/docs/history/1.6.0/img/spinner.gif differ diff --git a/docs/history/1.6.0/index.html b/docs/history/1.6.0/index.html new file mode 100644 index 0000000..c313d5a --- /dev/null +++ b/docs/history/1.6.0/index.html @@ -0,0 +1,156 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Button Merchant Library

+ +

License: MIT +Coverage Status +Version +Platform

+

Documentation

+ +

Documentation for the Merchant Library can be found on the Button Developer site.

+ +

Reference docs are also available.

+

Example

+ +

To run the example project, clone the repo, run pod install, and run the Example scheme.

+

Installation

+ +

ButtonMerchant is available through CocoaPods and Carthage.

+

Swift Pacakage Manager

+ +

In Xcode, navigate to File → Swift Packages → Add Package Dependency

+ +

Enter the package repository URL:

+ +

https://github.com/button/button-merchant-ios

+ +

Note: Ensure to select ‘Up to Next Major’ version when prompted.

+

CocoaPods

+ +

Add this line to your Podfile:

+
pod 'ButtonMerchant'
+
+

Carthage

+ +

Or, add this to your Cartfile:

+
github "button/button-merchant-ios" ~> 1.0
+
+

Author

+ +

Button, Inc.

+

License

+ +

ButtonMerchant is available under the MIT license. See the LICENSE file for more info.

+

Contributing

+ +

We are looking forward to accepting your contributions to this project very soon!

+ +

Until then, if you have something you would like to contribute, please get in touch.

+ +
+
+ +
+
+ + diff --git a/docs/history/1.6.0/js/jazzy.js b/docs/history/1.6.0/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.6.0/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +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 +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/history/1.6.0/js/jazzy.search.js b/docs/history/1.6.0/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.6.0/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/history/1.6.0/js/jquery.min.js b/docs/history/1.6.0/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/history/1.6.0/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),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("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/history/1.6.0/js/typeahead.jquery.js b/docs/history/1.6.0/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.6.0/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/history/1.6.0/search.json b/docs/history/1.6.0/search.json new file mode 100644 index 0000000..a80e836 --- /dev/null +++ b/docs/history/1.6.0/search.json @@ -0,0 +1 @@ +{"Structs.html#/s:14ButtonMerchant7VersionV":{"name":"Version","abstract":"

Button Merchant Library Version.

"},"Protocols/Configurable.html#/c:@M@ButtonMerchant@objc(pl)Configurable(py)includesIFA":{"name":"includesIFA","abstract":"

Deprecated. This library does not read the advertising identifier even when premission is granted by the user.

","parent_name":"Configurable"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","abstract":"

The product identifier.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","abstract":"

The UPC (Universal Product Code) of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","abstract":"

A flat array of the names of the categories to which the product belongs.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","abstract":"

The name of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","abstract":"

The ISO-4217 currency code in which the product’s value is reported.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","abstract":"

The value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","abstract":"

The quantity of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","abstract":"

The URL of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","abstract":"

Any additional attributes to be included with the product.

","parent_name":"ButtonProductCompatible"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productViewed:":{"name":"productViewed(_:)","abstract":"

Report that the user has viewed a product.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productAddedToCart:":{"name":"productAddedToCart(_:)","abstract":"

Report that the user added a product to their cart.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)cartViewed:":{"name":"cartViewed(_:)","abstract":"

Report that the user viewed their cart.

","parent_name":"Activity"},"Protocols/Activity.html":{"name":"Activity","abstract":"

A protocol through which user activities can be reported.

"},"Protocols/ButtonProductCompatible.html":{"name":"ButtonProductCompatible","abstract":"

A protocol that defines the product properties that may be provided when reporting user activity.

"},"Protocols/Configurable.html":{"name":"Configurable","abstract":"

An interface through which library features can be enabled/disabled.

"},"Enums/NetworkError.html#/s:14ButtonMerchant12NetworkErrorO7unknownyA2CmF":{"name":"unknown","abstract":"

There was an unknown network error.

","parent_name":"NetworkError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO15noApplicationIdyA2CmF":{"name":"noApplicationId","abstract":"

Library is not configured with an applicationId

","parent_name":"ConfigurationError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO20invalidApplicationIdyACSS_tcACmF":{"name":"invalidApplicationId(appicationId:)","abstract":"

Undocumented

","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"

Button Merchant Library Errors.

"},"Enums/ConfigurationError.html":{"name":"ConfigurationError","abstract":"

Button Merchant Library Configuration Error.

"},"Enums/NetworkError.html":{"name":"NetworkError","abstract":"

Button Merchant Library Configuration Error.

"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8quantitySivp":{"name":"quantity","abstract":"

The number of unique units represented by this line item (default is 1).

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC15itemDescriptionSSSgvp":{"name":"itemDescription","abstract":"

Text describing the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3skuSSSgvp":{"name":"sku","abstract":"

The Stock Keeping Unit of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3upcSSSgvp":{"name":"upc","abstract":"

The Universal Product Code of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8categorySaySSGSgvp":{"name":"category","abstract":"

The category of the line item.","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC10attributesSDyS2SGSgvp":{"name":"attributes","abstract":"

A key/value store for strings to specify additional information about a line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC2id5totalAESS_s5Int64Vtcfc":{"name":"init(id:total:)","abstract":"

An array of the line item details that comprise the order

","parent_name":"LineItem"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5emailSSSgvp":{"name":"email","abstract":"

The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5isNewSbSgvp":{"name":"isNew","abstract":"

A flag indicating whether the customer is new (or not).

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC2idAESS_tcfc":{"name":"init(id:)","abstract":"

Initializes a customer object with the passed parameters.

","parent_name":"Customer"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)currencyCode":{"name":"currencyCode","abstract":"

The ISO 4217 currency code (default is USD).

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customerOrderId":{"name":"customerOrderId","abstract":"

The customer-facing order id.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customer":{"name":"customer","abstract":"

The customer related to the order

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:purchaseDate:lineItems:":{"name":"init(id:purchaseDate:lineItems:)","abstract":"

Initializes an order object with the passed parameters.

","parent_name":"Order"},"Classes/Order/Customer.html":{"name":"Customer","abstract":"

Represents a customer in the order.

","parent_name":"Order"},"Classes/Order/LineItem.html":{"name":"LineItem","abstract":"

Represents a line item in the order.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:amount:currencyCode:":{"name":"init(id:amount:currencyCode:)","abstract":"

Deprecated.

","parent_name":"Order"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","parent_name":"ButtonProduct"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)attributionToken":{"name":"attributionToken","abstract":"

The last tracked attributionToken from an inbound Button attributed URL.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)configureWithApplicationId:":{"name":"configure(applicationId:)","abstract":"

Configures ButtonMerchant with your application Id.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingURL:":{"name":"trackIncomingURL(_:)","abstract":"

Checks the passed URL for a Button attribution and if present stores the token.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingUserActivity:":{"name":"trackIncomingUserActivity(_:)","abstract":"

Checks the URL in the passed NSUserActivity for a Button attribution and if present stores the token.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)handlePostInstallURL:":{"name":"handlePostInstallURL(_:)","abstract":"

Checks to see if the user visited a url prior to installing your app.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)reportOrder:completion:":{"name":"reportOrder(_:completion:)","abstract":"

Reports an order to Button.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)clearAllData":{"name":"clearAllData()","abstract":"

Discards the current session and all persisted data.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)features":{"name":"features","abstract":"

An interface through which library features can be enabled/disabled.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)activity":{"name":"activity","abstract":"

An interface through which user activity can be reported.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@CM@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackOrder:completion:":{"name":"trackOrder(_:completion:)","abstract":"

Deprecated.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html":{"name":"ButtonMerchant","abstract":"

ButtonMerchant is the main entry point to the library.

"},"Classes/ButtonProduct.html":{"name":"ButtonProduct","abstract":"

A concrete implementation of the ButtonProductCompatible protocol.

"},"Classes/Order.html":{"name":"Order","abstract":"

Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/docs/history/1.6.0/undocumented.json b/docs/history/1.6.0/undocumented.json new file mode 100644 index 0000000..4a10f95 --- /dev/null +++ b/docs/history/1.6.0/undocumented.json @@ -0,0 +1,26 @@ +{ + "warnings": [ + { + "file": "/Users/wes/Developer/button-merchant-ios/Source/ButtonMerchantError.swift", + "line": 32, + "symbol": "ButtonMerchantError.trackOrderDeprecationError", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/wes/Developer/button-merchant-ios/Source/ButtonMerchantError.swift", + "line": 33, + "symbol": "ButtonMerchantError.noEventsError", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/wes/Developer/button-merchant-ios/Source/ConfigurationError.swift", + "line": 46, + "symbol": "ConfigurationError.invalidApplicationId(appicationId:)", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + } + ], + "source_directory": "/Users/wes/Developer/button-merchant-ios" +} \ No newline at end of file diff --git a/docs/latest b/docs/latest index 8502778..b35bc9c 120000 --- a/docs/latest +++ b/docs/latest @@ -1 +1 @@ -./history/1.5.1 \ No newline at end of file +./history/1.6.0 \ No newline at end of file