PageSourceSearch

https://www.glogerm.com/mm5/themes/levels/js/scripts.js

js glogerm.com collected 2026-09-24 12:08:02 UTC 47,184 bytes, 1,381 lines download raw bytes

1
2var cornerstoneUX = {
3	init: function () {
4		String.prototype.toCamelCase = function(cap1st) {
5			return ((cap1st ? '-' : '') + this).replace(/-+([^-])/g, function(a, b) {
6				return b.toUpperCase();
7			});
8		};
9		var pageID = document.body.id.toCamelCase();
10
11		if (cornerstoneUX[pageID]) {
12			// ---- If the function exists, run it, otherwise, don't do anything. ---- //
13			$(document).ready(function () {
14				cornerstoneUX[pageID]();
15			});
16		}
17
18		$(document).ready(function () {
19			// ---- Create the "main" element for older versions of IE ---- //
20			document.createElement('main');
21
22			$('.js-hide').hide();
23			$('.js-show').show();
24			$('.js-remove').remove();
25			$('select, :text, textarea').not('.input').addClass('input');
26			cornerstoneUX.sharedFunctions.toggle();
27			cornerstoneUX.sharedFunctions.showHide();
28			cornerstoneUX.sharedFunctions.tabs();
29
30			$('.js-slide-toggle').on('click', function (e) {
31				e.preventDefault();
32
33				var $trigger = $(this),
34					$target = $($trigger.data('target'));
35
36				$target.slideToggle('fast');
37
38			});
39
40			// ---- Allow Named Anchors With A Class Of "smoothscroll" To Work Without Full URL ---- //
41			$('a[href^="\#"].smoothscroll').on('click', function (e) {
42				e.preventDefault();
43				var selector = this.href.substr(this.href.indexOf('#')),
44					target = $(selector),
45					offset = 10;
46
47				if (target.offset().top > windowHeight / 2) {
48					offset = $('#js-header').outerHeight();
49				}
50
51				scrollToDiv(target, offset);
52			});
53
54			// ---- Quantity Incrementer ---- //
55			$('#js-increase-quantity, .js-increase-quantity').on('click', function () {
56				var $qty = $(this).parent().prev(),
57					currentVal = parseInt($qty.val()),
58					$update = $(this).parent().siblings('.js-update-quantity');
59
60				if (!isNaN(currentVal)) {
61					$qty.val(currentVal + 1).change();
62					$update.trigger('click');
63				}
64			});
65			$('#js-decrease-quantity, .js-decrease-quantity').on('click', function () {
66				var $qty = $(this).parent().prev(),
67					currentVal = parseInt($qty.val()),
68					min = (!isNaN($qty.data('min'))) ? $qty.data('min') : 1,
69					$update = $(this).parent().siblings('.js-update-quantity');
70
71				if (!isNaN(currentVal) && currentVal > min) {
72					$qty.val(currentVal - 1).change();
73					$update.trigger('click');
74				}
75			});
76
77			$('.js-read-more').readmore({
78				speed: 75,
79				moreLink: '<a href="#" class="js-read-more-toggle read-more-toggle">... read more</a>',
80				lessLink: '<a href="#" class="js-read-more-toggle read-less-toggle">read less</a>',
81				collapsedHeight: 67,
82				embedCSS: false
83			});
84
85			// ---- Sticky ---- //
86			function stickyHeader() {
87				// Main Header & Stick Header
88				var jsHeader = $('#js-header'),
89					stickyNav = $('#js-sticky-header'),
90					jsHHeight = $(jsHeader).height(),
91					sNHeight = $(stickyNav).height(),
92					jsMain = $('main');
93				// Copying of the Logo & dropdown menu
94				var allCategoriesNav = $('#js-all-categories-nav').clone();
95				$(allCategoriesNav).attr('id', 'js-sticky-categories-nav');
96
97				$('#js-sticky-dropdown-button .dropdown-menu-sticky-wrap').html( allCategoriesNav );
98				$(window).scroll(function () {
99					if ( $(this).scrollTop() >= jsHHeight) {
100						$(stickyNav).addClass('slideDownSticky');
101						$(jsHeader).addClass('sticky-shown');
102						$(jsMain).addClass('sticky-is-shown');
103					} else if ( $(stickyNav).hasClass('slideDownSticky') ) {
104						$(stickyNav).removeClass('slideDownSticky');
105						$(jsHeader).removeClass('sticky-shown');
106						$(jsMain).removeClass('sticky-is-shown');
107					}
108				});
109			}
110			//stickyHeader();
111
112			(function floatingPlaceholder(){
113				function updateText(event){
114					var $input = $(this);
115
116					setTimeout(function(){
117						if( $input.val() !== '' || $input.is(':focus') || $input.prop('tagName') === 'SELECT' ) {
118							$input.parent().addClass('floating-placeholder-float');
119						} else {
120							$input.parent().removeClass('floating-placeholder-float');
121						}
122					}, 1);
123				}
124				$('.floating-placeholder .input').each(updateText);
125				$('.floating-placeholder .input, .floating-placeholder select').on('input keyup change blur', updateText);
126			})();
127
128			(function(){
129				var autocomplete = {
130					$inputs: $('.js-autocomplete-input'),
131					$results: $('.js-autocomplete-results'),
132					init: function(){
133						autocomplete.$inputs.on('input', autocomplete.getResults);
134						autocomplete.$inputs.on('blur', autocomplete.hideResults);
135						// TODO: Add keyboard controls
136					},
137					getResults: debounce(function(e) {
138						var $input = $(this),
139							search = $.trim($input.val());
140
141						if( !search.length ) return;
142
143						$.get(
144							$input.data('api-url'),
145							{
146								Get: 'autocomplete',
147								Search: search
148							},
149							autocomplete.displayResults
150						);
151					}, 150),
152					displayResults: function(response){
153						if( !$.trim(response) ){
154							autocomplete.$results.hide();
155							return;
156						}
157						autocomplete.$results.html(response);
158						autocomplete.$results.fadeIn(100);
159					},
160					hideResults: debounce(function(){
161						autocomplete.$results.fadeOut(100);
162					}, 750)
163				};
164				autocomplete.init();
165			})();
166
167			// ---- Back to Top Controls ---- //
168			(function backToTop () {
169				if ($(window).innerWidth() < 768) {
170					return;
171				}
172
173				var chaser = $('#js-chaser'),
174					windowHeight = $(window).height();
175
176				if (chaser) {
177					$(window).scroll(function() {
178						if ($(window).scrollTop() >= windowHeight / 2) {
179							chaser.fadeIn();
180						}
181						else {
182							chaser.hide();
183						}
184					});
185
186					chaser.on('click', function () {
187						$('html, body').animate({scrollTop: '0px'}, 800);
188					});
189				}
190			})();
191
192			// ---- On scroll, fix the header to the top ---- //
193			// if (document.location.protocol !== 'https:' && $(window).innerWidth() > 768) {
194			// 	$('#js-header').stuck();
195			// }
196
197			// ---- Toggle global search display ---- //
198			$('#js-open-global-search, #js-open-global-search--tablet').on('click', function (e) {
199				e.preventDefault();
200				$(this).toggleClass('bg-gray');
201				$('#js-global-search').fadeToggle();
202			});
203
204			// ---- Mobile Footer Links Control ---- //
205			function footerNavControl () {
206				/* Corrects positioning of virtual keyboard */
207				$(document).on('focus', 'input, select, textarea', function () {
208					$('#mobile-footer').hide();
209				});
210				$(document).on('blur', 'input, select, textarea', function () {
211					$('#mobile-footer').show();
212				});
213			}
214			$(window).on('debouncedresize load', footerNavControl ());
215
216		});
217
218		$('.js-az-menu-trigger').on('click', function(e){
219			e.preventDefault();
220			$('.nav-group-2').toggle();
221			if( !$('.nav-group-2').is(':visible') ){
222				$('.nav-group-3, .nav-group-4').hide();
223			}
224		});
225
226		$('.js-az-menu-trigger, #js-sticky-dropdown-button .button').on('mouseenter', function(){
227			$('.nav-group-2').show();
228		});
229
230		var timer;
231		$('.js-az-menu-trigger, #js-sticky-dropdown-button .button, .nav-group-2, .nav-group-3, .nav-group-4').on({
232			mouseover: function(){
233				clearTimeout(timer);
234			},
235			mouseout: function(e){
236				clearTimeout(timer);
237				timer = setTimeout(function(){
238					$('.nav-group-2, .nav-group-3, .nav-group-4').hide();
239				}, 250);
240			}
241		});
242
243		$('.nav-group-2 a').on('mouseenter', function() {
244			$('.nav-group-3').css('min-height', $(this).parent().height());
245		});
246
247		$.getScript(theme_path + '/js/jquery.menu-aim.js', function(data, textStatus) {
248			$('.nav-group-2').menuAim({
249				 activate: function(row) {
250				 	var $item = $(row),
251				 		id = $item.data('navigationitem-id'),
252						$group = $('.nav-group-4[data-navigationitem-id="' + id + '"]');
253
254					$('.nav-group-4').hide();
255					if( $group.find('.nav-group-5').length ){
256						$group.show();
257						$('.nav-group-3').show();
258					}
259				 },
260				 deactivate: function(row) {
261				 	$('.nav-group-4').hide();
262				 	$('.nav-group-3').hide();
263				 },
264				 rowSelector: ".nav-item-2"
265			 });
266		});
267
268		// ---- Mobile Footer Links Control ---- //
269		function mobileFooterToggles(h5) {
270			if ( $(window).width() <= 768 ) {
271				if ( $(h5).parent().find('.mobile-toggle').is(':visible') ) {
272					$(h5).find('span').attr('data-icon', 'L');
273				} else {
274					$(h5).find('span').attr('data-icon', 'K');
275				}
276				$(h5).parent().find('.mobile-toggle').slideToggle();
277			}
278		}
279		$('footer h5').on('click', function(e) {
280			mobileFooterToggles($(this));
281		});
282	},
283	sharedFunctions: {
284		// ---- Product Carousels ---- //
285		productsCarousels: function (carousel, append) {
286			var carousel = $(carousel);
287			if (append === true) {
288				var appendArrowsTo = $(carousel.selector).parent();
289			}
290			else if (append === 'undefined') {
291				var appendArrowsTo = $(carousel.selector);
292			}
293
294			$.getScript(theme_path + '/js/jquery.slick.min.js', function () {
295				carousel.slick({
296					appendArrows: appendArrowsTo,
297					draggable: false,
298					slidesToScroll: 3,
299					slidesToShow: 3,
300					responsive: [
301						{
302							breakpoint: 960,
303							settings: {
304								slidesToScroll: 2,
305								slidesToShow: 2
306							}
307						},
308						{
309							breakpoint: 767,
310							settings: {
311								slidesToScroll: 1,
312								slidesToShow: 1
313							}
314						}
315					]
316				});
317			});
318		},
319		// ---- Cart Summary Controls ---- //
320		cartSummary: function () {
321			var marker = $('#js-toggle-cart-summary-contents').find('span'),
322				clickCount = 0;
323
324			$('#js-toggle-cart-summary-contents').on('click', function (e) {
325				e.preventDefault();
326				if (clickCount) {
327					marker.html('&#9660;');
328					clickCount = 0;
329					$('#js-cart-summary-contents').slideDown();
330				}
331				else {
332					clickCount = 1;
333					marker.html('&#9658;');
334					$('#js-cart-summary-contents').slideUp();
335				}
336			});
337			if ($(window).innerWidth() < 768) {
338				$('#js-toggle-cart-summary-contents').click();
339			}
340		},
341
342		// ---- Open Forgot Password ---- //
343		openForgotPassword: function (pageID) {
344			$('#js-open-forgot-password').magnificPopup({
345				callbacks: {
346					open: function () {
347						if (pageID === 'jsOCST') {
348							// magnificPopup.close();
349						}
350					}
351				},
352				focus: '#l-Customer_LoginEmail',
353				items: {
354					src: $('#js-forgot-password'),
355					type: 'inline'
356				}
357			});
358		},
359
360		// ---- Conform all subcategory and/or product DIVs to same height ---- //
361		conformDisplay: function (selector) {
362			var targetElement = selector || '.category-product';
363
364			$(window).on('load', function () {
365				$(targetElement).conformity({mode: 'height'});
366			});
367			$(window).on('resize', function () {
368				$(targetElement).conformity({mode: 'height'});
369			});
370		},
371
372		// ---- Open Product Image Gallery ---- //
373		productGallery: function (trigger) {
374			trigger.on('click', function (e) {
375				var startAt = Number($(this).attr('data-index'));
376
377				e.preventDefault();
378				if (gallery.length > 0) {
379					$.magnificPopup.open({
380						callbacks: {
381							open: function () {
382								$.magnificPopup.instance.goTo(startAt);
383							}
384						},
385						gallery: {
386							enabled: true
387						},
388						items: gallery,
389						type: 'image'
390					});
391				}
392				else {
393					$.magnificPopup.open({
394						items: {
395							src: $('#js-main-image').attr('data-image')
396						},
397						type: 'image'
398					});
399				}
400			});
401		},
402
403		// ---- Quick View Function ---- //
404		openQuickView: function () {
405			$('.quick-view, .js-quick-view').on('click', function (e){
406				var productLink = $(this).data('product-link');
407
408				e.preventDefault();
409				$.magnificPopup.open({
410					items: {
411						src: productLink
412					},
413					type: 'iframe'
414				});
415			});
416		},
417
418		// ---- Miva Google Address Autocomplete ---- //
419		/*mvGAAC: {
420			init: function(){
421				var self = this;
422				$('.js-geocomplete-input').removeAttr('placeholder');
423				$(window).on('load', function(){
424					$('.js-geocomplete-input').removeAttr('placeholder');
425				});
426				$.getScript('//cdnjs.cloudflare.com/ajax/libs/geocomplete/1.6.5/jquery.geocomplete.min.js', cornerstoneUX.sharedFunctions.mvGAAC.loaded);
427			},
428			loaded: function(){
429				$('.js-geocomplete-input')
430					.geocomplete()
431					.bind('geocode:result', cornerstoneUX.sharedFunctions.mvGAAC.result);
432			},
433			result: function(event, result){
434				var $input = $(this),
435					$container = $input.closest('.js-geocomplete-container'),
436					streetNumber = '',
437					streetName = '',
438					country = '',
439					address = '';
440
441				result.address_components.reverse();
442
443				$.each(result.address_components, function(index, component){
444					var component_type = component.types[0];
445
446					switch (component_type){
447						case 'street_number':
448							streetNumber = component.long_name;
449							address = streetNumber;
450							if( streetName ){
451								address += ' ' + streetName;
452							}
453							$container.find('[name$="Address1"], [name$="_addr"]').val(address).trigger('input');
454							break;
455						case 'route':
456							streetName = component.long_name;
457							address = '';
458							if(streetNumber){
459								address = streetNumber + ' ' + streetName;
460							}
461							$container.find('[name$="Address1"], [name$="_addr"]').val(address).trigger('input');
462							break;
463						case 'locality':
464							$container.find('[name$="City"], [name$="_city"]').val(component.long_name).trigger('input');
465							break;
466						case 'administrative_area_level_1':
467							if( country === 'US' ){
468								$container.find('[name$="StateSelect"], [name$="_state"]').val(component.short_name).trigger('input');
469							} else {
470								$container.find('[name$="State"]').val(component.short_name).trigger('input');
471							}
472							break;
473						case 'country':
474							country = component.short_name;
475							$container.find('[name$="Country"], [name$="_cntry"]').val(component.short_name).trigger('change');
476							break;
477						case 'postal_code':
478							$container.find('[name$="Zip"], [name$="_zip"]').val(component.long_name).trigger('input');
479							break;
480						default:
481							break;
482					}
483				});
484			}
485		},*/
486		toggle: function(){
487			$('[data-toggle]').each(function(){
488				var $trigger = $(this),
489					target = $trigger.data('toggle'),
490					$target = $(target);
491				$trigger.prepend('<span data-icon="&#x4c;"></span>&nbsp;&nbsp;&nbsp;');
492				if( $target.is(':visible') ){
493					$trigger.addClass('active');
494				}
495			});
496			$('[data-toggle]').on('click', function(e){
497				e.preventDefault();
498				var $trigger = $(this),
499					target = $trigger.data('toggle'),
500					$target = $(target);
501
502				if( $target.is(':visible') ){
503					$target.slideUp('fast');
504					$trigger.find('[data-icon]').replaceWith('<span data-icon="&#x4c;"></span>');
505					$trigger.removeClass('active');
506				} else {
507					$target.slideDown('fast');
508					$trigger.find('[data-icon]').replaceWith('<span data-icon="&#x4b;"></span>');
509					$trigger.addClass('active');
510				}
511			});
512		},
513		showHide: function(){
514			$('[data-show]').on('click', function(){
515				var $this = $(this);
516				$($this.data('show')).show();
517			});
518			$('[data-hide]').on('click', function(){
519				var $this = $(this);
520				$($this.data('hide')).hide();
521			});
522		},
523		tabs: function(){
524			$('.js-tabs').each(function(){
525				var $container = $(this);
526				$container.find('.js-tab').first().addClass('tab-active');
527				$container.find('.js-tab-item:gt(0)').hide();
528			});
529			$('.js-tabs').on('click', '.js-tab', function(e){
530				e.preventDefault();
531				var $tab = $(this),
532					index = $tab.index(),
533					$container = $tab.closest('.js-tabs'),
534					$tabItem = $container.find('.tab-item:eq(' + index + '), .js-tab-item:eq(' + index + ')');
535
536				if( $tabItem.is(':visible') ){
537					return false;
538				}
539
540				$container.find('.tab-active').removeClass('tab-active');
541				$container.find('.tab-item, .js-tab-item').fadeOut(200);
542				$tabItem.fadeIn(200);
543				$tab.addClass('tab-active');
544			});
545		}
546	},
547
548	jsSFNT: function () {
549		// ---- Product Carousel ---- //
550		cornerstoneUX.sharedFunctions.productsCarousels('#js-whats-popular-carousel');
551
552		// ---- Open Quick View ---- //
553		cornerstoneUX.sharedFunctions.openQuickView();
554		function minFeaturedProductsHeight() {
555			var minHeight = $('#js-featured-products-height').outerHeight();
556			$('.js-featured-products-height-min').css('min-height', minHeight);
557		}
558		minFeaturedProductsHeight();
559		$(window).on('resize', minFeaturedProductsHeight);
560
561	},
562
563	jsCTGY: function () {
564		// ---- Conform all subcategory and/or product DIVs to same height ---- //
565		cornerstoneUX.sharedFunctions.conformDisplay();
566		cornerstoneUX.sharedFunctions.conformDisplay('.sub-category');
567
568		// ---- Open Quick View ---- //
569		cornerstoneUX.sharedFunctions.openQuickView();
570	},
571
572	jsPROD: function () {
573		// ---- Open Product Image Gallery ---- //
574		cornerstoneUX.sharedFunctions.productGallery($('#js-main-image-zoom'));
575
576		var mainImageZoom = $('#js-main-image-zoom'),
577			thumbnails = $('#js-thumbnails');
578
579		//console.log(window['image_data' + productID][0]['image_data'][2]);
580		thumbnails.on('click', 'div', function () {
581			var thumbnailIndex = $(this).attr('data-index');
582			mainImageZoom.attr('data-index', thumbnailIndex);
583			var clickedLI = parseFloat($(this).attr('data-index'));
584			if ( thumbnailIndex ) {
585				$('#js-main-dots li.active').removeClass('active');
586				$('#js-main-dots li[data-index="' + thumbnailIndex + '"]').addClass('active');
587			}
588		});
589
590		$.getScript(theme_path + '/js/jquery.slick.min.js', function () {
591			$('#js-thumbnails').slick({
592				vertical: true,
593				draggable: false,
594				slidesToScroll: 1,
595				slidesToShow: 4
596			});
597		});
598		$(window).resize( function() {
599			$('#js-thumbnails').slickSetOption(null,null,true);
600		});
601
602		// ---- Update Button For "Out Of Stock" ---- //
603		function outOfStock () {
604			var button = $('#js-add-to-cart'),
605				buttonText = button.val();
606
607			if (button.is(':disabled') === true) {
608				button.addClass('bg-gray').val('Sold Out');
609			}
610			else {
611				button.removeClass('bg-gray').val(buttonText);
612			}
613		}
614		outOfStock();
615
616		// ---- Set Initial Swatch Name ---- //
617		$('#js-swatch-name').text($('#js-swatch-select').find('option:first-child').text());
618
619		// ---- Add Border to Active Swatch ---- //
620		function selectedSwatch () {
621			$('#js-swatches').find('li').each(function () {
622				var swatchElement = $(this),
623					swatchColor = swatchElement.attr('data-code');
624
625				swatchElement.removeClass('selected-swatch');
626				if (swatchColor === $('#js-swatch-select').find('option:selected').val() ) {
627					swatchElement.addClass('selected-swatch');
628					// swatchColor = swatchColor.replace(/ /g,'');
629					// swatchColor = swatchColor.toLowerCase();
630
631					// var namedColors = {
632					// 	aliceblue: 'f0f8ff',antiquewhite: 'faebd7',aqua: '00ffff',aquamarine: '7fffd4',azure: 'f0ffff',beige: 'f5f5dc',bisque: 'ffe4c4',black: '000000',blanchedalmond: 'ffebcd',blue: '0000ff',blueviolet: '8a2be2',brown: 'a52a2a',burlywood: 'deb887',cadetblue: '5f9ea0',chartreuse: '7fff00',chocolate: 'd2691e',coral: 'ff7f50',cornflowerblue: '6495ed',cornsilk: 'fff8dc',crimson: 'dc143c',cyan: '00ffff',darkblue: '00008b',darkcyan: '008b8b',darkgoldenrod: 'b8860b',darkgray: 'a9a9a9',darkgreen: '006400',darkkhaki: 'bdb76b',darkmagenta: '8b008b',darkolivegreen: '556b2f',darkorange: 'ff8c00',darkorchid: '9932cc',darkred: '8b0000',darksalmon: 'e9967a',darkseagreen: '8fbc8f',darkslateblue: '483d8b',darkslategray: '2f4f4f',darkturquoise: '00ced1',darkviolet: '9400d3',deeppink: 'ff1493',deepskyblue: '00bfff',dimgray: '696969',dodgerblue: '1e90ff',feldspar: 'd19275',firebrick: 'b22222',floralwhite: 'fffaf0',forestgreen: '228b22',fuchsia: 'ff00ff',gainsboro: 'dcdcdc',ghostwhite: 'f8f8ff',gold: 'ffd700',goldenrod: 'daa520',gray: '808080',green: '008000',greenyellow: 'adff2f',honeydew: 'f0fff0',hotpink: 'ff69b4',indianred : 'cd5c5c',indigo : '4b0082',ivory: 'fffff0',khaki: 'f0e68c',lavender: 'e6e6fa',lavenderblush: 'fff0f5',lawngreen: '7cfc00',lemonchiffon: 'fffacd',lightblue: 'add8e6',lightcoral: 'f08080',lightcyan: 'e0ffff',lightgoldenrodyellow: 'fafad2',lightgrey: 'd3d3d3',lightgreen: '90ee90',lightpink: 'ffb6c1',lightsalmon: 'ffa07a',lightseagreen: '20b2aa',lightskyblue: '87cefa',lightslateblue: '8470ff',lightslategray: '778899',lightsteelblue: 'b0c4de',lightyellow: 'ffffe0',lime: '00ff00',limegreen: '32cd32',linen: 'faf0e6',magenta: 'ff00ff',maroon: '800000',mediumaquamarine: '66cdaa',mediumblue: '0000cd',mediumorchid: 'ba55d3',mediumpurple: '9370d8',mediumseagreen: '3cb371',mediumslateblue: '7b68ee',mediumspringgreen: '00fa9a',mediumturquoise: '48d1cc',mediumvioletred: 'c71585',midnightblue: '191970',mintcream: 'f5fffa',mistyrose: 'ffe4e1',moccasin: 'ffe4b5',navajowhite: 'ffdead',navy: '000080',oldlace: 'fdf5e6',olive: '8
63208000',olivedrab: '6b8e23',orange: 'ffa500',orangered: 'ff4500',orchid: 'da70d6',palegoldenrod: 'eee8aa',palegreen: '98fb98',paleturquoise: 'afeeee',palevioletred: 'd87093',papayawhip: 'ffefd5',peachpuff: 'ffdab9',peru: 'cd853f',pink: 'ffc0cb',plum: 'dda0dd',powderblue: 'b0e0e6',purple: '800080',red: 'ff0000',rosybrown: 'bc8f8f',royalblue: '4169e1',saddlebrown: '8b4513',salmon: 'fa8072',sandybrown: 'f4a460',seagreen: '2e8b57',seashell: 'fff5ee',sienna: 'a0522d',silver: 'c0c0c0',skyblue: '87ceeb',slateblue: '6a5acd',slategray: '708090',snow: 'fffafa',springgreen: '00ff7f',steelblue: '4682b4',tan: 'd2b48c',teal: '008080',thistle: 'd8bfd8',tomato: 'ff6347',turquoise: '40e0d0',violet: 'ee82ee',violetred: 'd02090',wheat: 'f5deb3',white: 'ffffff',whitesmoke: 'f5f5f5',yellow: 'ffff00',yellowgreen: '9acd32'
633					// };
634					// for (var key in namedColors) {
635					// 	if (swatchColor === key) {
636					// 		swatchElement.css('border-color', '#' + namedColors[key]);
637					// 	}
638					// 	else {
639					// 		swatchElement.addClass('selected-swatch');
640					// 	}
641					// }
642				}
643			});
644		}
645		selectedSwatch();
646
647		// ---- Update Display When Attribute Machine Fires ---- //
648		MivaEvents.SubscribeToEvent('variant_changed', function () {
649			gallery.length = 0;
650			mainImageZoom.attr('data-index', 0);
651			thumbnailIndex = 0;
652			outOfStock();
653			selectedSwatch();
654		});
655
656		// ---- Update Display Price Based on Attribute Selections (If Attribute Machine Is Not Being Used) ---- //
657		if (typeof attrMachCall === 'undefined' && document.getElementById('js-product-attribute-count').value > 0) {
658			for(var baseProductPrice=Number(document.getElementById("js-price-value").getAttribute("data-base-price")),regularProductPrice=Number(),productAttributeCount=Number(document.getElementById("js-product-attribute-count").value+1),productAttributes=document.getElementById("js-purchase-product").elements,attributeType=[""],i=0;i<productAttributes.length;i++){var tagName=productAttributes[i].tagName.toLowerCase(),elementType=productAttributes[i].type,type=productAttributes[i].getAttribute("data-attribute-type"), name=productAttributes[i].name;"hidden"==elementType&&null!=type&&attributeType.push(type);productAttributes[i].onchange=function(){updateProductDisplayPrice()}} function updateProductDisplayPrice(){for(var b,a,c=baseProductPrice,f=regularProductPrice,d=1;d<productAttributeCount;d++)if(b=document.getElementsByName("Product_Attributes["+d+"]:value"),"select"==attributeType[d])for(var e=0;e<b.length;e++)a=b.item(e),a=a.options.item(a.selectedIndex),c+=Number(a.getAttribute("data-option-price")),f+=Number(a.getAttribute("data-regular-price"));else if("radio"==attributeType[d]||"checkbox"==attributeType[d])for(e=0;e<b.length;e++)a=b.item(e),a.checked&&(c+=Number(a.getAttribute("data-option-price")), f+=Number(a.getAttribute("data-regular-price")));else if("text"==attributeType[d]||"memo"==attributeType[d])a=b.item(0),a.value&&(c+=Number(a.getAttribute("data-option-price")),f+=Number(a.getAttribute("data-regular-price")));b=document.getElementsByName("Quantity");c*=Number(b.item(0).value);b.item(0);document.getElementById("js-price-value").innerHTML=formatCurrency(c);document.getElementById("js-mobile-price-value")&&(document.getElementById("js-mobile-price-value").innerHTML=formatCurrency(c))} function formatCurrency(b){var a=!1;0>b&&(a=!0,b=Math.abs(b));return(a?"-$":"$")+parseFloat(b,10).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g,"$1,").toString()}updateProductDisplayPrice();
659		}
660
661		// ---- AJAX Add To Cart ---- //
662		function addToCart () {
663			$('#js-add-to-cart').on('click', function (e) {
664				var purchaseForm = $('#js-purchase-product');
665				// Check the form is not currently submitting
666				if (purchaseForm.data('formstatus') !== 'submitting') {
667					// Set up variables
668					var form = purchaseForm,
669						formData = form.serialize(),
670						formUrl = form.attr('action').replace('^https?:', ''),
671						formMethod = form.attr('method'),
672						responseMessage = $('#js-purchase-message'),
673						miniBasket = $('#js-mini-basket-container'),
674						processingImage = $('#js-processing-purchase'),
675						purchaseButton = $(this),
676						purchaseButtonText = purchaseButton.val();
677
678					// Add status data to form
679					form.data('formstatus', 'submitting');
680
681					// Show processing message
682					processingImage.show();
683					purchaseButton.toggleDisabled().val('Processing...');
684					responseMessage.html('').hide();
685
686					// Send data to server for validation
687					$.ajax({
688						url: formUrl,
689						type: formMethod,
690						cache: false,
691						data: formData,
692						success: function(data, textStatus, jqXHR) {
693							if (data.search(/id="js-BASK"/i) != -1) {
694								$('html, body').animate({scrollTop: '0px'}, 250);
695								var responseMiniBasket = $(data).find('#js-mini-basket-container'),
696									miniBasketCount = responseMiniBasket.contents()[1].getAttribute('data-itemcount'),
697									miniBasketSubtotal = ' ' + responseMiniBasket.contents()[1].getAttribute('data-subtotal'),
698									miniBasketLinkCount = $('#js-mini-basket-count, #js-mobile-basket-button .notification'),
699									miniBasketLinkSubtotal = $('#js-mini-basket-subtotal');
700
701								miniBasketLinkCount.text(miniBasketCount); // Update basket quantity (display only)
702								miniBasketLinkSubtotal.text(miniBasketSubtotal); // Update basket subtotal (display only)
703
704								miniBasket.html(responseMiniBasket.contents()).addClass('open');
705								setTimeout(function () {
706									miniBasket.removeClass('open');
707								}, 5000);
708
709								// Re-Initialize Attribute Machine (if it is active)
710								if (typeof attrMachCall !== 'undefined') {
711									attrMachCall.Initialize();
712								}
713							}
714							else if(data.search(/id="js-PATR"/i) != -1) {
715								var missingAttrs = [];
716								form.find('.required').each(function () {
717									missingAttrs.push(' ' + $(this).attr('title'));
718								});
719								responseMessage.html('All <em class="red">Required</em> options have not been selected.<br />Please review the following options: <span class="red">' + missingAttrs + '</span>.').fadeIn().delay(5000).fadeOut();
720							}
721							else if(data.search(/id="js-PLMT"/i) != -1) {
722								responseMessage.html('We do not have enough of the Size/Color you have selected.<br />Please adjust your quantity.').fadeIn().delay(3000).fadeOut();
723							}
724							else if(data.search(/id="js-POUT"/i) != -1) {
725								responseMessage.html('The Size/Color you have selected is out of stock.<br />Please review your options or check back later.').fadeIn().delay(3000).fadeOut();
726							}
727							else {
728								responseMessage.html('Please review options.').fadeIn().delay(3000).fadeOut();
729							}
730
731							// Hide processing message and reset formstatus
732							processingImage.hide();
733							purchaseButton.toggleDisabled().val(purchaseButtonText);
734							form.data('formstatus', 'idle');
735						},
736						error: function (jqXHR, textStatus, errorThrown) {
737						}
738					});
739				}
740				// Prevent form from submitting
741				e.preventDefault();
742				e.stopImmediatePropagation();
743			});
744		}
745		addToCart();
746
747		// ---- Related Products Carousel ---- //
748		$.getScript(theme_path + '/js/jquery.slick.min.js', function () {
749			$('#js-related-products-carousel').slick({
750				draggable: false,
751				slidesToScroll: 2,
752				slidesToShow: 2,
753			});
754		});
755
756		// --- Mobile slider for Images --- //
757		function mobileImageSlider() {
758			var totalThumbs = parseFloat($('#js-thumbnails .thumbnail-img-wrap').length - 1 ),
759				currentImg = parseFloat($('#js-main-image-zoom').attr('data-index'));
760
761				if (totalThumbs === -1 ) {
762					$('.main-image-nav').hide();
763				} else {
764					$('#js-main-dots').html('');
765					$('#js-main-dots').html('<ul class="inline-list np"></ul>');
766					for (var i = totalThumbs; i >= 0; i--) {
767						if (i > 0){
768							$('#js-main-dots ul').prepend('<li data-index="' + i + '"></li>');
769						} else {
770							$('#js-main-dots ul').prepend('<li class="active" data-index="' + i + '"></li>');
771						}
772					}
773				}
774
775
776			$('#js-main-dots ul li').on('click', function() {
777				var clickedLI = parseFloat($(this).attr('data-index'));
778				$('#js-thumbnails .thumbnail-img-wrap[data-index="' + clickedLI + '"]').click();
779				$('#js-main-dots ul li.active').removeClass('active');
780				$(this).addClass('active');
781				currentImg = clickedLI;
782			});
783
784			function nextMobileImage() {
785				var currIndex = parseFloat($('#js-main-image-zoom').attr('data-index')),
786					nextImage = $('#js-main-dots li[data-index="' + (currIndex + 1) + '"]'),
787					firstImage = $('#js-main-dots li[data-index="0"]');
788				if ($(nextImage).length > 0) {
789					$(nextImage).click();
790				} else {
791					$(firstImage).click();
792				}
793			}
794
795			function prevMobileImage() {
796				var currIndex = parseFloat($('#js-main-image-zoom').attr('data-index')),
797					prevImage = $('#js-main-dots li[data-index="' + (currIndex - 1) + '"]'),
798					lastImage = $('#js-main-dots li[data-index="' + totalThumbs + '"]');
799				if ($(prevImage).length > 0) {
800					$(prevImage).click();
801				} else {
802					$(lastImage).click();
803				}
804
805			}
806			if (totalThumbs > 1 ) {
807				$("#js-main-image-zoom").swipe( {
808					swipeLeft:function(event, direction, distance, duration, fingerCount) {
809						nextMobileImage();
810					},
811					swipeRight:function(event, direction, distance, duration, fingerCount) {
812						prevMobileImage();
813					},
814					threshold:10
815				});
816			}
817		}
818		mobileImageSlider();
819
820	},
821
822	jsPLST: function () {
823		// ---- Conform all subcategory and/or product DIVs to same height ---- //
824		cornerstoneUX.sharedFunctions.conformDisplay();
825
826		// ---- Open Quick View ---- //
827		cornerstoneUX.sharedFunctions.openQuickView();
828	},
829
830	jsSRCH: function () {
831		// ---- Conform all subcategory and/or product DIVs to same height ---- //
832		cornerstoneUX.sharedFunctions.conformDisplay();
833
834		// ---- Open Quick View ---- //
835		cornerstoneUX.sharedFunctions.openQuickView();
836	},
837
838	jsBASK: function () {
839		// ---- Remove Item From Basket (Compatible down to IE6) ---- //
840		$('.remove-item').on('click', function (e) {
841			$(this).children('input').prop('checked', 'checked');
842			if ($(this).children('input').is(':checked')) {
843				e.stopImmediatePropagation();
844				$('#js-bask-form').submit();
845			}
846		});
847
848		// ---- Estimate Shipping Function ---- //
849		function estimateShipping () {
850			function resetFields () {
851				$('#js-shipping-estimate-state-select').prop('selectedIndex', 0);
852				$('#js-shipping-estimate-country').val(default_country);
853				$('#js-shipping-estimate-state, #js-shipping-estimate-zip').val('');
854			}
855
856			$('#js-show-shipping-estimate').on('click', function (e) {
857				e.preventDefault();
858				$('#js-shipping-estimate-dialog').fadeToggle();
859				resetFields();
860			});
861
862			$('#js-shipping-estimate-recalculate').on('click', function (e) {
863				e.preventDefault();
864				$(this).hide();
865				$('#js-shipping-estimate-results').fadeOut(function () {
866					$('#js-shipping-estimate-fields').fadeIn();
867				}).empty();
868			});
869
870			$('#js-shipping-estimate-form').on('submit', function (e) {
871				e.preventDefault();
872				if ($(this).data('formstatus') !== 'submitting') {
873
874					var form = $(this),
875						formData = form.serialize(),
876						formUrl = form.attr('action'),
877						formMethod = form.attr('method');
878
879					form.data('formstatus', 'submitting');
880					$('#js-processing-request').show();
881					$.ajax({
882						url: formUrl,
883						type: formMethod,
884						data: formData,
885						success: function(data, textStatus, jqXHR) {
886							$('#js-shipping-estimate-fields').fadeOut(function () {
887								$('#js-shipping-estimate-results').html(data).fadeIn();
888								$('#js-shipping-estimate-recalculate').fadeIn();
889							});
890							resetFields ();
891							form.data('formstatus', 'idle');
892							$('#js-processing-request').hide();
893						},
894						error: function (jqXHR, textStatus, errorThrown) {
895							console.log(errorThrown);
896							form.data('formstatus', 'idle');
897						}
898					});
899				}
900			});
901		}
902		estimateShipping();
903
904	},
905
906	jsACAD: function () {
907		// ---- Copy Email Address to Shipping or Billing Email ---- //
908		$('#js-Customer_LoginEmail').on('blur', function () {
909			var primaryAddress = $(this).attr('data-primary'),
910				shippingEmail = $('#js-Customer_ShipEmail'),
911				billingEmail = $('#js-Customer_BillEmail');
912
913			if (primaryAddress === 'shipping') {
914				if (shippingEmail && (shippingEmail.val() === '')) {
915					shippingEmail.val($(this).val());
916				}
917			}
918			else if (primaryAddress === 'billing') {
919				if (billingEmail && (billingEmail.val() === '')) {
920					billingEmail.val($(this).val());
921				}
922			}
923		});
924
925		// ---- Toggle Customer Fields Controls ---- //
926		// cornerstoneUX.sharedFunctions.toggleCustomerFields();
927	},
928
929	jsACED: function () {
930		// ---- Toggle Customer Fields Controls ---- //
931		// cornerstoneUX.sharedFunctions.toggleCustomerFields();
932	},
933
934	jsCTUS: function () {
935		// ---- Additional Server Security To Help Against Spambots ---- //
936		$.getScript('//ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.min.js', function(){
937			var contactForm = $('#js-contact-form');
938			$('#js-noscript-warning').remove();
939			contactForm.show();
940			var url = theme_path + '/forms/token.php';
941			$.get(url, function (tkn) {
942				contactForm.append('<input type="hidden" name="mms" value="' + tkn + '" />');
943			});
944
945			// ---- Form Validation ---- //
946			contactForm.validate({
947				errorContainer: '#js-contact-form div.message',
948				errorLabelContainer: '#js-contact-form div.message small',
949				errorElement: 'p',
950				rules: {
951					contactName: {required: true, minlength: 2},
952					contactEmail: {required: true, email: true},
953					contactComment: {required: true, minlength: 2}
954				},
955				messages: {
956					contactName: {required: 'Your Name Is Required', minlength: jQuery.validator.format('Your Name must be a minimum of {0} characters!')},
957					contactEmail: {required: 'Your Email Address Is Required', email: 'Your Email Address must be formatted like [email protected]'},
958					contactComment: {required: 'Comments or Questions Are Required', minlength: jQuery.validator.format('Your Message must be a minimum of {0} characters!')}
959				},
960				highlight: function (element, errorClass) {
961					$(element.form).find('label[for=' + element.id + ']').addClass(errorClass);
962				},
963				unhighlight: function (element, errorClass) {
964					$(element.form).find('label[for=' + element.id + ']').removeClass(errorClass);
965				},
966				submitHandler: function (form) {
967					if ($(this).data('formstatus') !== 'submitting') {
968						var form = contactForm,
969							formData = form.serialize(),
970							formUrl = form.attr('action'),
971							formMethod = form.attr('method');
972
973						form.data('formstatus', 'submitting');
974						$.ajax({
975							url: formUrl,
976							type: formMethod,
977							data: formData,
978							success: function(data, textStatus, jqXHR) {
979								// Show reponse message
980								if (data.search(/error/i) != -1) {
981									$('#js-contact-form div.message').fadeOut(200, function () {
982										$(this).removeClass('message-info').addClass('message-error').text(data).fadeIn(200);
983									});
984								}
985								else {
986									$('#js-contact-form div.message').removeClass('message-error').addClass('message-success').text(data).fadeIn(200);
987								}
988								form.data('formstatus', 'idle');
989							},
990							error: function (jqXHR, textStatus, errorThrown) {
991								console.log(errorThrown);
992								form.data('formstatus', 'idle');
993							}
994						});
995					}
996				}
997			});
998		});
999	},
1000
1001	jsAFCL: function () {
1002		// ---- Open Forgot Password ---- //
1003		cornerstoneUX.sharedFunctions.openForgotPassword();
1004	},
1005
1006	jsWLST: function () {
1007		// ---- Open Forgot Password ---- //
1008		cornerstoneUX.sharedFunctions.openForgotPassword();
1009	},
1010
1011	jsLOGN: function () {
1012		// ---- Open Forgot Password ---- //
1013		cornerstoneUX.sharedFunctions.openForgotPassword();
1014	},
1015
1016	jsORDL: function () {
1017		// ---- Open Forgot Password ---- //
1018		cornerstoneUX.sharedFunctions.openForgotPassword();
1019	},
1020
1021	jsORHL: function () {
1022		// ---- Open Forgot Password ---- //
1023		cornerstoneUX.sharedFunctions.openForgotPassword();
1024	},
1025
1026	jsOCST: function () {
1027		// ---- Open Log-In Form ---- //
1028		$('#js-open-ocst-login').magnificPopup({
1029			focus: '#l-Customer_LoginEmail',
1030			items: {
1031				src: $('#js-ocst-login'),
1032				type: 'inline'
1033			}
1034		});
1035
1036		// ---- Open Forgot Password ---- //
1037		cornerstoneUX.sharedFunctions.openForgotPassword('jsOCST');
1038
1039		// ---- Cart Summary Controls ---- //
1040		cornerstoneUX.sharedFunctions.cartSummary();
1041
1042		// ---- Google Address Autocomplete ---- //
1043		// cornerstoneUX.sharedFunctions.mvGAAC.init();
1044
1045		// ---- Show/Hide State Field --- //
1046		(function(){
1047			var $countries = $('#ShipCountry, #BillCountry'),
1048				updateStateFromCountry = function(){
1049				var $select = $(this),
1050					$row = $select.closest('.form-row'),
1051					$next_row = $row.next('.form-row'),
1052					$next_select_row = $next_row.find('.js-state-select-wrapper'),
1053					$next_select = $next_select_row.find('select'),
1054					$next_input_row = $next_row.find('.js-state-input-wrapper'),
1055					$next_input = $next_input_row.find('input');
1056
1057				if( $select.val() === default_country){
1058					$next_select_row.show();
1059					$next_input_row.hide();
1060					$next_input.val('');
1061				} else {
1062					$next_select_row.hide();
1063					$next_input_row.show();
1064					$next_select.val('');
1065				}
1066			};
1067
1068			$countries.each( updateStateFromCountry );
1069			$countries.on('change', updateStateFromCountry);
1070		})();
1071
1072
1073
1074		$('#l-ShipEmail').on('input', function(){
1075			var $input = $(this),
1076				email = $input.val();
1077
1078			$('#js-create-customer-email-display').text( email );
1079			$('#js-create-customer-email-input').val( email );
1080		});
1081
1082
1083		(function(){
1084			var updateCreateCustomerFields = function(){
1085				var $toggle = $('#js-create-customer');
1086
1087				if( $toggle.is(':checked') ){
1088					$('#js-create-customer-fields').slideDown('fast');
1089					$('#js-Customer_Password, #js-Customer_VerifyPassword').prop('required', true);
1090				} else {
1091					$('#js-create-customer-fields').slideUp('fast');
1092					$('#js-Customer_Password, #js-Customer_VerifyPassword').val('').trigger('input').prop('required', false);
1093				}
1094			};
1095			$('#js-create-customer').on('change', updateCreateCustomerFields);
1096			updateCreateCustomerFields();
1097		})();
1098
1099
1100		$('#js-Customer_Password, #js-Customer_VerifyPassword').on('input', function(){
1101			var $password = $('#js-Customer_Password'),
1102				password = $password.val(),
1103				$verify_password = $('#js-Customer_VerifyPassword'),
1104				verify_password = $verify_password.val(),
1105				$message = $('#js-password-message');
1106
1107			if( password && password.length && verify_password && verify_password.length ){
1108				if( password === verify_password ){
1109					$message.html('<span class="green"><span data-icon="&#x52;"></span> Passwords Match</span>');
1110				} else {
1111					$message.html('<span class="red"><span data-icon="&#x51;"></span> Passwords Do Not Match</span>');
1112				}
1113			} else {
1114				$message.html('');
1115			}
1116		});
1117
1118		(function(){
1119			var createdCustomer = false;
1120			$('#js-ocst-form').on('submit', function(e){
1121
1122				var $form = $(this),
1123					$button = $form.find('input[type="submit"]'),
1124					fields = $form.serializeArray(),
1125					data = '',
1126					screenFound = false;
1127
1128				// Don't submit if we are already submitting
1129				if( $form.data('status') === 'submitting' ) return;
1130
1131				// Let submit proceed if they are not creating customer
1132				if ( !$('#js-create-customer').is(':checked') ) return;
1133
1134				// Let submit proceed we have successfully created a customer using the following AJAX call
1135				if ( createdCustomer ) return;
1136
1137				e.preventDefault();
1138
1139				$form.data('status', 'submitting');
1140				$('#js-messages').html('');
1141				$button.data('value', $button.attr('value') );
1142				$button.prop('disabled', true).attr('value', 'Creating Account...');
1143
1144				if( ToggleDetails.trigger.checked ){
1145					ToggleDetails.CopyFields();
1146					$(ToggleDetails.secondary_inputs, ToggleDetails.secondary_selects).trigger('input');
1147				}
1148
1149				$.each(fields, function(i, field){
1150					// Rename OCST fields to create an account
1151					if( field.name === 'Action' ){
1152						data += '&Action=ICST';
1153					} else if( field.name === 'Screen' ){
1154						data += '&Screen=ACED';
1155						screenFound = true;
1156					} else if( /(Ship|Bill)/.test(field.name) ){
1157						data += '&Customer_' + field.name + '=' + field.value;
1158					} else {
1159						data += '&' + field.name + '=' + field.value;
1160					}
1161				});
1162
1163				if( !screenFound ){
1164					data += '&Screen=ACED';
1165				}
1166
1167				var cust_create_url = $('#customer_create_url').val();
1168
1169				$.ajax({
1170					url: cust_create_url,
1171					type: 'POST',
1172					dataType: 'json',
1173					data: data + '&api=1',
1174				})
1175				.done(function(response) {
1176					if( response.page_code ==='ACED' ){
1177						createdCustomer = true;
1178						$form.append('<input type="hidden" name="Customer_Created" value="yes">');
1179						$form.submit();
1180					} else if( response.error_messages.length ){
1181						var html = '<div class="message message-error">';
1182						html += '<br />';
1183						$.each(response.error_messages, function(i, error){
1184							html += error + '<br>';
1185						});
1186						html += '</div>';
1187						$('#js-messages').html(html);
1188						scrollToDiv( $('#js-messages'), 50);
1189						// TODO: Add better input validation
1190					}
1191				})
1192				.always(function() {
1193					$form.data('status', '');
1194					$button.prop('disabled', false).attr('value', $button.data('value') );
1195				});
1196
1197			});
1198		})();
1199
1200	},
1201
1202	jsOSEL: function () {
1203		// ---- Cart Summary Controls ---- //
1204		cornerstoneUX.sharedFunctions.cartSummary();
1205	},
1206
1207	jsOPAY: function () {
1208		// ---- Cart Summary Controls ---- //
1209		cornerstoneUX.sharedFunctions.cartSummary();
1210
1211		// ---- Make Credit Card Expiration Fields More User-Friendly ---- //
1212		$('#js-cc_exp select').first().find('option:first').text('Month');
1213		$('#js-cc_exp select').last().find('option:first').text('Year');
1214
1215		// ---- CVV Information Function ---- //
1216		$('#js-open-cvv-information').magnificPopup({
1217			items: {
1218				src: $('#js-cvv-information'),
1219				type: 'inline'
1220			}
1221		});
1222
1223		// ---- Secondary Form Submit Button ---- //
1224		$('#js-opay-form-submit').on('click', function () {
1225			$('#js-opay-form').submit();
1226		});
1227
1228		// ---- Opayments ---- //
1229		(function(){
1230			var opayments = {};
1231			opayments.debug = false;
1232			opayments.$form = $('input[name="Action"]').closest('form');
1233			opayments.$actualRows = $('.payment-field-row');
1234			opayments.$proxyInputs = $('.proxy-input');
1235
1236			opayments.init = function(){
1237				if( !$('.proxy-payment-fields').length ){
1238					return;
1239				}
1240				opayments.copyAllActualToProxy();
1241				opayments.$actualRows.on('input keyup blur change', 'input, select', opayments.copyAllActualToProxy);
1242				opayments.$proxyInputs.on('input keyup blur change', opayments.copyProxyInputToActual);
1243				opayments.$form.on('submit', opayments.copyAllProxyToActual );
1244
1245				if( opayments.debug ){
1246					opayments.$actualRows.css('opacity', 0.5);
1247				} else {
1248					opayments.$actualRows.hide();
1249				}
1250				$('.proxy-payment-fields').show();
1251			};
1252
1253			opayments.copyActualRowToProxy = function(){
1254				var $row = $(this),
1255					code = $row.data('code'),
1256					invalid = $row.data('invalid'),
1257					classes = (!!invalid) ? 'invalid red' : '',
1258					$input = $row.find('input');
1259
1260				switch (code) {
1261					case 'cc_exp':
1262						$('.proxy-input-cc_exp_month').closest('.proxy-payment-field-row').addClass(classe
1262s);
1263						$('.proxy-input-cc_exp_month').val( $row.find('[name*="Month"], [name*="month"]').val() );
1264						$('.proxy-input-cc_exp_year').val( $row.find('[name*="Year"], [name*="year"]').val() );
1265						break;
1266					case 'cc_name':
1267					case 'cc_fname':
1268					case 'cc_lname':
1269					case 'cc_number':
1270					case 'cc_cvv':
1271					case 'cvv':
1272					default:
1273						$('.proxy-input-' + code).closest('.proxy-payment-field-row').addClass(classes);
1274						$('.proxy-input-' + code).val( $input.val() );
1275						break;
1276				}
1277			};
1278
1279			opayments.copyAllActualToProxy = function(){
1280				opayments.$actualRows.each( opayments.copyActualRowToProxy );
1281			};
1282
1283			opayments.copyProxyInputToActual = function(){
1284				var $input = $(this),
1285					code = $input.data('code'),
1286					$proxy = {};
1287
1288				switch (code) {
1289					case 'cc_exp_month':
1290						$proxy = opayments.$form.find('[name*="Month"], [name*="month"]');
1291						break;
1292					case 'cc_exp_year':
1293						$proxy = opayments.$form.find('[name*="Year"], [name*="year"]');
1294						break;
1295					case 'cc_name':
1296					case 'cc_fname':
1297					case 'cc_lname':
1298					case 'cc_number':
1299					case 'cc_cvv':
1300					case 'cvv':
1301					default:
1302						$proxy = $('.payment-field-row-' + code).find('input');
1303						break;
1304				}
1305
1306				$proxy.val( $input.val() );
1307			};
1308			opayments.copyAllProxyToActual = function(){
1309				opayments.$proxyInputs.each( opayments.copyProxyInputToActual );
1310			};
1311
1312			opayments.init();
1313		})();
1314
1315		(function creditCardFormatting(){
1316			$.getScript('https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/2.0.0/jquery.payment.min.js', function(){
1317				var creditCardTypeMap = {
1318					visa: '.payment-method-selectors input:radio[data-name="Visa"]',
1319					mastercard: '.payment-method-selectors input:radio[data-name="MasterCard"]',
1320					amex: '.payment-method-selectors input:radio[data-name="American Express"]',
1321					discover: '.payment-method-selectors input:radio[data-name="Discover"]'
1322				},
1323				$form = $('#js-opay-form'),
1324				$paymentMethods = $form.find('input:radio[name="PaymentMethod"]'),
1325				$cc_number = $form.find('.proxy-input-cc_number'),
1326				updatePaymentMethod = function(){
1327					var type = $.payment.cardType( $cc_number.val() ),
1328						$matchingPaymentMethod = $(creditCardTypeMap[type]);
1329
1330					if( $matchingPaymentMethod.length ){
1331						$matchingPaymentMethod.prop('checked', true);
1332					}
1333				};
1334				$cc_number.payment('formatCardNumber').on('input blur', updatePaymentMethod);
1335				$('.proxy-input-cc_cvv, .proxy-input-cvv').payment('formatCardCVC');
1336				updatePaymentMethod();
1337			});
1338		})();
1339	},
1340
1341	jsINVC: function () {
1342	},
1343
1344	jsORDP: function () {
1345		// ---- Launch Printer Dialog ---- //
1346		window.print();
1347	},
1348
1349	jsSMAP: function () {
1350		// ---- Conform all site map DIVs to same height ---- //
1351		cornerstoneUX.sharedFunctions.conformDisplay('.site-map');
1352	},
1353
1354	jsGFTL: function () {
1355		// ---- Open Forgot Password ---- //
1356		cornerstoneUX.sharedFunctions.openForgotPassword();
1357	},
1358
1359	jsWLGN: function () {
1360		// ---- Open Forgot Password ---- //
1361		cornerstoneUX.sharedFunctions.openForgotPassword();
1362	},
1363
1364	jsCSBE: function () {
1365		$('.qty-dec').on('click', function() {
1366			var qtyBox = $(this).parent().find('[name="Quantity"]'),
1367				qty = parseFloat( $(qtyBox).val() );
1368			if ( qty > 1 ) {
1369				$(qtyBox).val( qty - 1 );
1370			}
1371		});
1372		$('.qty-inc').on('click', function() {
1373			var qtyBox = $(this).parent().find('[name="Quantity"]'),
1374				qty = parseFloat( $(qtyBox).val() );
1375			if ( qty ) {
1376				$(qtyBox).val( qty + 1 );
1377			}
1378		});
1379	}
1380};
1381cornerstoneUX.init();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.