Free U.S. Shipping Over $49
- Best Sellers
Bags
-
-
Best Sellers
-
Backpacks
-
Travel Bags
-
Laptop Bags
-
-
Collapsible Bags
-
Bag Bundles
-
Sale
Camera
-
All Camera
-
Best Sellers
-
Camera New Arrivals
-
Camera Slings
-
Camera Accessories
Shop Peter McKinnon Collection Luma Camera CollectionDesigned with Peter McKinnonLuggage
-
All Luggage
-
Carry-On Luggage
-
Check-In Luggage
Shop All Luggage Shop Carry-On Luggage- Best Sellers
-
Bags
Best Sellers
Backpacks
Travel Bags
Laptop Bags
Collapsible Bags
Bag Bundles
Sale
Shop Best SellersShop BackpackBest For Daily Use -
Camera
All Camera
Best Sellers
Camera New Arrivals
Camera Slings
Camera Accessories
Shop Peter McKinnon CollectionLuma Camera CollectionDesigned with Peter McKinnonCamera Accessories -
Luggage
All Luggage
Carry-On Luggage
Check-In Luggage
Shop All LuggageShop Carry-On LuggageShop Check-in Luggage -
Apparel
Shop All
Jacket
Pant
T-Shirt
Jogger
Outset JacketJacket to Pillow in SecondsOutset T-ShirtBuy 3 or More, Save 15% -
Accessories
All Accessories
Best Sellers
Travel Accessories
Camera Accessories
Everyday Accessories
Garment Bags
Shop All AccessoriesShop Packing CubesShop Toiletry Bag
account Log in icon-search Searchicon-cartCart
The McKinnon
Camera CollectionYour new favorite Camera Bags
The Mckinnon Collection
All Camera
Best Seller
McKinnon Camera Pack 35L $399.99Best Seller
McKinnon Camera Pack 25L from $299.99Best Seller
McKinnon Sling 8L $159.99Staff Favorite
McKinnon Cube Pack 21L $124.99New
Luma Camera Pack 18L $219.99New
Luma Camera Sling 12L $139.99New
Luma Camera Sling 9L $119.99New
McKinnon Tech Organizer $69.99McKinnon Accessory Case $54.99McKinnon Battery Case $29.99McKinnon Memory Card Case $29.99McKinnon Filter Case $44.99Camera Accessories
Staff Favorite
McKinnon Cube Pack 21L $124.99McKinnon Cube - Large $69.99McKinnon Cube - Small $44.99New
McKinnon Tech Organizer $69.99McKinnon Accessory Case $54.99McKinnon Battery Case $29.99McKinnon Memory Card Case $29.99McKinnon Accessory Straps (Set of 2) $19.99McKinnon Camera Pack 25L Divider Kit $39.99McKinnon Camera Pack 35L Divider Kit - Long $59.99McKinnon Camera Pack 35L Divider Kit - Short $44.99McKinnon Filter Case $44.99McKinnon Camera Pack 35L Rain Cover $29.99New
Luma Shock Cord 2-Pack $9.99Camera Bags Best SellersCamera Bags New Arrivals-
The McKinnon Collection
'); $n.before($o); } }); } addSlider($nodes){ const $t = this; $t.wait('[data-nm009-class="nm009-upsell-slider-container"]', ($n)=>{ if(!$t.hasNode('[data-nm009-class="nm009-upsell-slider"]')){ const $o = $t.j('
'); const $ceil = Math.ceil(($nodes.length - 2) / 2); for(let $c = 0; $c < $ceil; $c++){ const $li = $t.j('
'); $nodes.each(($i, $l)=>{ if($i < ($nodes.length - 2)){ if($c === (Math.floor($i / 2))){ const $clone = $t.j($l).children('.upcart-upsell-item-card').clone(true); $clone.attr('data-nm009-slide-clone-index', $i); $t.j($l).attr('data-nm009-slide-index', $i); if($clone.find('select').length > 0){ $clone.find('select').on('change', function($e){ $e.preventDefault(); const $form = $t.j(this).closest('form'); const $href = $form.prev().find('a').attr('href'); const $query = ($href.indexOf('?') !== -1) ? $href.split('?') : [$href]; const $pathname = $query[0].split('/'); const $handle = $pathname[$pathname.length - 1]; $t.debug($handle + ' ' + $t.j(this).val()); $t.j.ajax({ url: '/products/' + $handle + '/.js', type: 'GET', dataType: 'json', success: ($r)=>{ $t.each($r.variants, ($variant, $vc)=>{ if($variant.id === parseInt($form.find('select').val())){ const $img = ($variant.featured_image !== null && typeof($variant.featured_image.src) === 'string') ? $variant.featured_image.src : $r.images[0]; $t.debug('img ' + $img); $form.prev().find('.upcart-upsell-item-price').html('$' + ($variant.price * .01).toFixed(2)); $form.closest('.upcart-upsell-item-card').find('.upcart-upsell-item-image').attr('src', $img); } }); }, error: ($x, $s, $e)=>{ console.log($x); console.log($s); console.log($e); } }); }); $clone.find('input[type="submit"]').on('click', function($e){ $e.preventDefault(); $t.debug($t.j(this).closest('form').find('select').val()); const $d = { items: [ {id: parseInt($t.j(this).closest('form').find('select').val()), quantity: 1} ] }; $t.cart.add($d, ()=>{ $t.debug('added upsell product'); window.upcartRegisterAddToCart(); }); }); $clone.find('input[type="submit"]').attr('type', 'button'); } else{ $clone.find('input[type="submit"]').on('click', function($e){ $e.preventDefault(); $t.j('[data-nm009-slide-index="' + $i + '"]').find('input[type="submit"]').eq(0).trigger('click'); }); $clone.find('input[type="submit"]').attr('type', 'button'); } $li.append($clone); } } }); $o.append($li); } $n.append($o); $t.slider.init('[data-nm009-class="nm009-upsell-slider"]', $t.sliderID, {addWrap: true, attrs: [ {name: 'display',value: 1}, {name: 'move-slide', value: 1}, {name: 'current-slide',value: 1}, {name: 'display-mobile',value: 1}, {name: 'current-slide-mobile',value: 1}, {name: 'move-slide-mobile',value: 1}, {name: 'controls',value: 1}, {name: 'pagination',value: 0}, {name: 'touch',value: 1} ]}) } }); } } class $cookiesClass{ constructor(){} set($n, $v, $exd){ const $d = new Date(); $d.setTime($d.getTime() + ($exd * 24 * 60 * 60 * 1000)); const $exp = 'expires=' + $d.toUTCString(); document.cookie = $n + '=' + $v + ';' + $exp + ';path=/'; } get($nm){ const $n = $nm + '='; const $decode = decodeURIComponent(document.cookie); const $ca = $decode.split(';'); for(const $ck of $ca){ if($ck.indexOf($n) !== -1){ const $s = $ck.split('='); return $s[1]; } } return ''; } check($n){ const $ck = this.get($n); return ($ck !== '') ? true : false; } } class $sliderClass{ constructor($j = jQuery, $hasNode = ()=>{}, $each = ()=>{}){ this.j = $j; this.hasNode = $hasNode; this.each = $each; }; init($selector, $id = 'sliderID', $params = {addWrap: true, attrs: []}){ const $t = this; $t.j($selector).attr('data-slider-id', $id); if($params.addWrap){ const $o = $t.j('
'); $t.j($selector).before($o); $o.append($t.j($selector)); } else{ $t.j($selector).parent().attr('data-slider-wrap', $id); } $t.tagSliderItems($selector); $t.updateAttrs($id, $params.attrs); $t.addStyle($id); } tagSliderItems($selector){ const $t = this; $t.j($selector).children().each(($i, $l)=>{ $t.j($l).attr('data-slider-item', $i); }); } updateAttrs($id, $attrs){ const $t = this; if($attrs.length > 0){ $t.each($attrs, ($p, $c)=>{ $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-' + $p.name, $p.value); $t.updateAttr($id, $p); }); } } updateAttr($id, $param){ const $t = this; switch($param.name){ case 'controls': if($param.value === 1){ $t.addControls($id); } break; case 'pagination': if($param.value === 1){ $t.addPagination($id); } break; case 'touch': if($param.value === 1){ $t.addTouchEvents($id); } break; default: break; } } addControls($id){ const $t = this; const $wrap = $t.j('[data-slider-wrap="' + $id + '"]'); const $next = $t.j(''); const $prev = $t.j(''); $next.on('click', function($e){ $e.preventDefault(); $t.next($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.next($id, true); } }); $prev.on('click', function($e){ $e.preventDefault(); $t.prev($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.prev($id, true); } }); $wrap.after($next); $wrap.after($prev); } next($id, $mobile = false){ const $t = this; const $m = ($mobile) ? '-mobile' : ''; const $current = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m); const $active = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-move-slide' + $m); const $tabs = Math.ceil($t.j('[data-slider-id="' + $id + '"]').children('[data-slider-item]').length / parseInt($active)); const $display = parseInt($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-display' + $m)); const $end = ($display > 1) ? $tabs - $display : $tabs; const $next = (parseInt($current) + 1 <= $end) ? parseInt($current) + 1 : 1; $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m, $next); $t.updatePagination($id, $next, $mobile); } prev($id, $mobile = false){ const $t = this; const $m = ($mobile) ? '-mobile' : ''; const $current = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m); const $active = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-move-slide' + $m); const $tabs = Math.ceil($t.j('[data-slider-id="' + $id + '"]').children('[data-slider-item]').length / parseInt($active)); const $display = parseInt($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-display' + $m)); const $end = ($display > 1 && $tabs > 1) ? $tabs - $display : $tabs; const $next = (parseInt($current) - 1 >= 1) ? parseInt($current) - 1 : $end; $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide' + $m, $next); $t.updatePagination($id, $next, $mobile); } addPagination($id){ const $t = this; const $current = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide') || 1; const $mCurrent = $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile') || 1; const $wrap = $t.j('[data-slider-wrap="' + $id + '"]'); const $page = $t.j('
'); $t.j('[data-slider-id="' + $id + '"]').children('[data-slider-item]').each(($i, $l)=>{ let $a = ($i + 1 === parseInt($current)) ? ' class="pagination-item-active"' : ''; if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $a = ($i + 1 === parseInt($mCurrent)) ? ' class="pagination-item-active pagination-item-mobile-active"' : $a; $a = ($i + 1 === parseInt($current) && $i + 1 === parseInt($mCurrent)) ? ' class="pagination-item-active pagination-item-mobile-active"' : $a; } const $li = $t.j('
'); $li.on('click', function($e){ $e.preventDefault(); $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide', $t.j(this).attr('data-slider-pagination-item')); $t.updatePagination($id, $t.j(this).attr('data-slider-pagination-item')); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile', $t.j(this).attr('data-slider-pagination-item')); $t.updatePagination($id, $t.j(this).attr('data-slider-pagination-item', true)); } }); $page.append($li); }); $wrap.append($page); } updatePagination($id, $next, $mobile = false){ const $t = this; if($mobile){ $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item]').removeClass('pagination-item-mobile-active'); $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item="' + $next + '"]').addClass('pagination-item-mobile-active'); } else{ $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item]').removeClass('pagination-item-active'); $t.j('[data-slider-pagination-container="' + $id + '"] [data-slider-pagination-item="' + $next + '"]').addClass('pagination-item-active'); } } addTouchEvents($id){ const $t = this; const $n = document.querySelector('[data-slider-id="' + $id + '"]'); let $xTouch = null; $n.addEventListener('touchstart', function($e){ $xTouch = $e.touches[0].clientX; }); $n.addEventListener('touchmove', function($e){ if(!$xTouch){return;} let $xUp = $e.touches[0].clientX; let $xDif = $xTouch - $xUp; if($xDif > 0){ $t.next($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.next($id, true); } } else{ $t.prev($id); if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $t.prev($id, true); } } $xTouch = null; }); } addStyle($id){ const $t = this; let $l = ''; const $i = $t.j('[data-slider-id="' + $id + '"] > [data-slider-item]').length; for(let $c = 0; $c < $i; $c++){ const $off = $c * -100; $l = $l + '[data-slider-current-slide="' + ($c + 1) + '"]{' + 'transform: translateX(' + $off + '%);' + '}'; } if(typeof($t.j('[data-slider-id="' + $id + '"]').attr('data-slider-current-slide-mobile')) !== 'undefined'){ $l = $l + '@media all and (max-width: 767px) { '; for(let $c = 0; $c < $i; $c++){ const $off = $c * -100; $l = $l + '[data-slider-current-slide-mobile="' + ($c + 1) + '"]{' + 'transform: translateX(' + $off + '%);' + '}'; } $l = $l + '} '; } if($t.hasNode('[data-slider-css="' + $id + '"]')){ const $s = $t.j('[data-slider-css="' + $id + '"]'); $s.html(''); $s.html($l); } else{ const $s = $t.j('
'); $s.html($l); $t.j('body').append($s); } } } class $shopifyCartClass{ constructor($j){ this.cartcount = 0; this.j = $j; } add($data, $callBack){ const $t = this; if($data.items.length > 0){ $t.get(($r)=>{ $t.cartcount = $r.item_count; console.log($t.cartcount); $t.j.ajax({ url: '/cart/add.js', type: 'POST', data: $data, dataType: 'json', success: ()=>{ $t.get(($rq)=>{ if($t.cartcount < $rq.item_count){ $callBack($rq); } }); }, error: ($x, $s, $e)=>{ console.log($x); console.log($s); console.log($e); } }); }); } } get($callBack){ const $t = this; $t.j.ajax({ url: '/cart.js', type: 'GET', dataType: 'json', success: ($rq)=>{ $callBack($rq); }, error: ($x, $s, $e)=>{ console.log($x); console.log($s); console.log($e); } }); } } const $djar_nm009_v1 = new $djar_nm009_v1_class(); $djar_nm009_v1.run();});