
/* BROWSER DETECTION */
jQuery.extend(jQuery.browser,
{SafariMobile : navigator.userAgent.toLowerCase().match(/iP(hone|ad|od)/i) }
);
/* For Testing Only */
/* $(function(){
  if($.browser.SafariMobile){
    alert('You are using Iphone or Ipad')
  }
}) */

$(function(){
  if($.browser.SafariMobile){
	$('html').addClass('iOS');
  }
})

 
/* UTILITY FUNCTIONS */
function selectItemByIndex(id, location) {
	$(location).each(function(i, item){
		$(item).toggleClass('selected', i == id);
	});
}

function selectItemByTrigger($trigger, location) {
	$(location).each(function(i, item){
		$(item).removeClass('selected');
	});
	$trigger.addClass('selected');
}

function getUrlVars() {
	var vars = {},
		tmp = [],
		hash,
		hashes = (window.location.href.indexOf('#') > 0)?(document.location.href.split('#')[0]).slice(window.location.href.indexOf('?') + 1).split('&'):window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'),
		i;
	for(var i = 0; i < hashes.length; i++){
		hash = hashes[i].split('=');
		if (typeof(vars[hash[0]]) != 'undefined'){
			tmp = [];
			tmp.push(vars[hash[0]]);
			tmp.push(hash[1]);
			vars[hash[0]] = tmp;
		}else{
			vars[hash[0]]=hash[1];
		}
	}
	return vars;
}

/* add dedup method to array */
Array.prototype.dedup = function() {
	var newArray = [],
		seen = {};
	
	for ( var i = 0; i < this.length; i++ ) {
		if ( seen[ this[i] ] ){
			continue;
		}
		newArray.push( this[i] );
		seen[ this[i] ] = 1;
	}
	return newArray;
};
Array.prototype.contains = function(obj) {
	var i = this.length;
	while (i--) {
		if (this[i] === obj) {
			return true;
		}
	}
	return false;
}
/* array sort function for product dropdowns */
function prioritySort(propertyName){
	return function (a, b) {
		if ((a.attributes[propertyName] !== undefined) && (b.attributes[propertyName] !== undefined)) {
			var aPriority = a.attributes[propertyName].priority;
			var bPriority = b.attributes[propertyName].priority;
			if (aPriority == bPriority) {
				var aName = a.attributes[propertyName].displayName.toLowerCase();
				var bName = b.attributes[propertyName].displayName.toLowerCase();
				if (aName < bName){
					return -1;
				} else if (aName > bName){
					return 1;
				}
			}else {
				return aPriority - bPriority;
			}
		} 
		return 0; // no sorting
		
	}
}
/* array sort function for gift cert dropdown */
function displayNameSort(propertyName){
	return function (a, b) {
		if ((a.attributes[propertyName] !== undefined) && (b.attributes[propertyName] !== undefined)) {
			var aName = a.attributes[propertyName].displayName.replace(/[^0-9]/g, '');
			var bName = b.attributes[propertyName].displayName.replace(/[^0-9]/g, '');
			return aName - bName;
		}
		return 0; // no sorting
	}
}
Object.size = function(obj) {
	var size = 0, key;
	for (key in obj) {
		if (obj.hasOwnProperty(key)) size++;
	}
	return size;
};

function jumpToAnchor(anchorId){
	var $anchor = $('#'+ anchorId);
	if ($anchor.length != 0){
		var new_position = $anchor.offset();
		window.scrollTo(new_position.left,new_position.top);
	}
}
function mouseTest(x, y, bBox) {
	return (x < bBox.l ) || (x >= bBox.r) || (y < bBox.t ) || (y >= bBox.b);
}

/* EXPANDING BANNER EXTENSION */
(function($){
	$.fn.expandingBanner = function (options) {
		options = $.extend({
				promocookie: "promobanner",
				delay: 1,
				persist: 20,
				expire: 0,
				pageloads: 0,
				emailcheck: false, 
				highlight: false,
				title: ""
			}, options);
		this.each(function() {
			banner = $(this);
			var promoDisplayBlock = 'null';
			if (options.emailcheck){
				promoDisplayBlock = ($.cookie('emailEntered'));
			}
			if (($.cookie(options.promocookie) != 'viewed') && (promoDisplayBlock != 'true') && (parseInt($.cookie("engagement")) >= options.pageloads)) {
				// Show Banner
				var t,
					mouseOutDelay = 10000,
					cmTitle = (options.title != "")?"expanding-banner "+ options.title:"expanding-banner";
				window.setTimeout(function() { 
					if(options.highlight == 'highlight') {
						banner.effect("highlight", {color: '#5F5853'}, 2000);
					} else {
						banner.slideDown('slow');
					}
					//cm tracking
					cmCreatePageviewTag(cmTitle, "", "expanding-banner");
					// Set cookie
					$.cookie(options.promocookie, 'viewed', {expires: options.expire / 24, path: '/'});
				}, options.delay * 1000);
				
				banner.find('.closeBanner').click(function() {
					banner.slideUp('fast');
				});
				// Delay before hiding banner
				t = window.setTimeout(function() { 
					banner.slideUp();
					}, options.persist * 1000);
				banner.find('input').focus(function() {
					mouseOutDelay = 500000;
				}).blur(function() {
					mouseOutDelay = 5000;
				});
				banner.hover(function() {
					clearTimeout(t);
					}, function() {
					t=window.setTimeout(function() {
						banner.slideUp();
					}, mouseOutDelay);
				});
			}
		});
		return this;
	};
})(jQuery);

/* EXPANDING LIST FUNCTION */
(function($){
	$.fn.collapsableList = function (options) {
		options = $.extend({
				size:10,
				label:false
			}, options);
		this.each(function() {
			var $list = $(this),
				size = options.size,
				hideVal = size-1,
				label = (options.label)?options.label:$list.attr('data-label'),
				showLabel = '',
				hideLabel = '',
				listSize = $list.children('li').length;
			
			if (listSize > size) {
				if (label != undefined && label != ''){
					hideLabel = '&lsaquo; fewer ' + label + 's';
					if (listSize - size > 1 ) {
						showLabel = '&rsaquo; ' + (listSize-size) + ' more ' + label + 's';
					} else {
						showLabel = '&rsaquo; ' + (listSize-size) + ' more ' + label;
					}
				} else {
					showLabel = '&rsaquo; ' + (listSize-size) + ' more';
					hideLabel = '&lsaquo; fewer';
				}
				/* Hide extra dimensions and add link to show more */
				$list.children('li:gt('+ hideVal +')').hide();
				$list.append('<li class="more-items"><a href="#"><strong>' + showLabel + ' </strong>...</a></li>')
					/* show more on click, remove link and add remove link */
					.delegate('.more-items', 'click', function(){
						$list.append('<li class="fewer-items"><a href="#"><strong>' + hideLabel +'</strong></a></li>')
							.children('li:gt('+ hideVal +')').show();
						$('.more-items', $list).remove();
						return false;
					})
					/*
					 * back to default: hide extra dimensions on click, remove
					 * link, add more link
					 */
					.delegate('.fewer-items', 'click', function(){
						$list.children('li:gt('+ hideVal +')').hide();
						$list.append('<li class="more-items"><a href="#"><strong>' + showLabel + '</strong>...</a></li>');
						$('.fewer-items', $list).remove();
						return false;
					});
			}
		});
		return this;
	};
})(jQuery);

/* Lifestyle Promo Display */
(function($){
	$.fn.lifestyleDisplay = function (options) {
		options = $.extend({
			visible:true // initial visibility state
			}, options);
		this.each(function() {
			var $container = $(this),
				containerWidth = $container.width(),
				containerHeight = $container.height();
			
			$('.lifestyle-info', $container).each(function(){
				var $this = $(this),
					divWidth = $this.width(),
					divHeight = $this.height(),
					divPos = $this.parent().position(),
					divTop = 0-(divHeight/2),
					divLeft = 0-(divWidth/2),
					positionData = {},
					flyoutDirection = 'top';
				
				
				if ($this.hasClass('flyout-top')) {
					flyoutDirection = 'top';
				} else if ($this.hasClass('flyout-bottom')){
					flyoutDirection = 'bottom';
				}
				else if ($this.hasClass('flyout-right')) {
					flyoutDirection = 'right';
				}
				else if($this.hasClass('flyout-left')) {
					flyoutDirection = 'left';
				}
				
				// position
				if (flyoutDirection == 'top' || flyoutDirection == 'bottom') {
					positionData.left = divLeft;
				} else {
					positionData.top = divTop;
				}
				
				// edge aviodance
				if ((divPos.top - divHeight/2) < 0 || (flyoutDirection == 'top' && (divPos.top - divHeight) < 0)){ 
					if ((divPos.left - divWidth/2) < 0 || (flyoutDirection == 'left' && (divPos.left - divWidth) < 0)){
						positionData = {top: 0, bottom:'auto', left: 0, right :'auto'};	// top left corner
					} else if ((containerWidth - divPos.left) < divWidth/2 || (flyoutDirection == 'right' && (divPos.left - divWidth) < 0)) {
						positionData = {top: 0, bottom:'auto', left: 'auto', right :0};	//top right corner
					} else {
						positionData = {top: 0, bottom:'auto', left: divLeft, right :'auto'};	// top
					}
				} else if ((containerWidth - divPos.left) < divWidth/2 || (flyoutDirection == 'right' && (containerWidth - divPos.left) < divWidth)){
					if ((containerHeight - divPos.top) < divHeight/2 || (flyoutDirection == 'bottom' && (containerHeight - divPos.top) < divHeight)) {
						positionData = {left:'auto', right: 0, bottom: 0, top: 'auto'};	// bottom right
					} else {
						positionData = {left:'auto', right: 0, bottom: 'auto', top: divTop};	// right
					}
				} else if ((containerHeight - divPos.top) < divHeight/2 || (flyoutDirection == 'bottom' && (containerHeight - divPos.top) < divHeight)){
					if ((divPos.left - divWidth/2) < 0){
						positionData = {top:'auto', bottom: 0, left:0, right:'auto'};	// bottom left
					} else {
						positionData = {top:'auto', bottom: 0, left: divLeft, right: 'auto'};	// bottom
					}
				} else if ((divPos.left - divWidth/2) < 0 || (flyoutDirection == 'left' && (divPos.left - divWidth) < 0)){
					positionData = {left: 0, right: 'auto', top: divTop, bottom :'auto'};	// left
				}
				
				$this.css(positionData);
				
			});
			
			// events
			$container.click(function (e) {
				var $target = $(e.target),
						prodId='';
				if ($target.hasClass('quickview-link')) {
					prodId = $target.attr('data-productId');
					skuId = $target.attr('data-skuId');
					quickView.launch({'productId':prodId, 'skuId':skuId});
				}
				if ($target.hasClass('lifestyle-icon')) {
					$target.parent().toggleClass('inactive').toggleClass('active');
					
				}
				return false;
			});
			
			//show
			if (options.visible == true) {
				$('.lifestyle-icon',$container).fadeIn();
				$('.lifestyle-sku-list',$container).fadeIn();
			}
			
		});
		return this;
	};
})(jQuery);

function initializePromoDisplay(image){
	$(image).parent().lifestyleDisplay();
}

/* AJAX LOAD PERSONAL ELEMENTS */
// header
function getProfileStatus(){
	$.ajax({
		url: '/sitewide/data/json/profile-status.jsp',
		dataType: 'json',
		cache: false,
		success: function(data) {
			showStatus(data);
			showHeaderSearchForm();
			showFooterEmailForm();
			showRegistryOptions(data);
			getPromoBanner();
		},
		error: function(){
			showStatus();
		}
	});
}
// Welcome Message
function showStatus(profile){
	var welcomeMsg = '',
		status = '',
		cartCount = '',
		firstName = '';
	if (profile != undefined){
		status = profile.status;
		cartCount = profile.cartCount;
		firstName = profile.firstName;
		if (status == '1'){
			welcomeMsg = '<li class="first">Welcome, <span id="accountHolder">'+ firstName +'</span> (<a href="/my-account/sign-out.jsp">Sign Out</a>)</li><li><a href="/my-account/index.jsp?link=topnav_account">My Account</a></li>';
		}else if (status == '0') {
			welcomeMsg = '<li class="first">Welcome, <span id="accountHolder">'+ firstName +'</span> (<a href="/my-account/sign-out.jsp">Not you?</a>)</li><li><a href="/my-account/index.jsp?link=topnav_account">My Account</a></li>';
		} else {
			welcomeMsg = '<li class="first"><a href="/my-account/sign-in.jsp?link=topnav_signin">Sign In</a></li><li><a href="/my-account/register.jsp?link=topnav_register">Register</a></li>';
		}
		$('#welcome').html(welcomeMsg);
		$('#util-cart').html('<a href="/checkout/shopping_cart.jsp">Cart ('+ cartCount + ')</a>');
		if (cartCount > 0) {
			$('#util-checkout').show();
		}
	} else {
		welcomeMsg = '<li class="first"><a href="/my-account/sign-in.jsp?link=topnav_signin">Sign In</a></li><li><a href="/my-account/register.jsp?link=topnav_register">Register</a></li>';
		$('#welcome').html(welcomeMsg);
		$('#util-cart').html('<a href="/checkout/shopping_cart.jsp">Cart (0)</a>');
	}
	
}
// footer email form
function showFooterEmailForm(){
	var staticContent = '<h3 class="brand">Email Signup</h3><ul><li><a href="/customer-service/footer-email-signup.jsp">Receive News &amp; Special Offers</a></li></ul>';
	$.ajax({
		url: '/sitewide/includes/footer/email-sign-up.jsp',
		dataType: 'html',
		success: function(data) {
			$(document).ready(function(){
				$('#signup').html(data);
			});
		},
		error: function (){
			$(document).ready(function(){
				$('#signup').html(staticContent);
			});
		}
	});
}
// header search form
function showHeaderSearchForm(){
	$.ajax({
		url: '/sitewide/includes/header/search.jsp',
		dataType: 'html',
		success: function(data) {
			$(document).ready(function(){
				$('#search').html(data);
			});
		}
	});
}

// For wishlist and registry on product page
function showRegistryOptions(profile){
	if (profile != undefined){
		if (profile.status == '1'){
			$(document).ready(function(){
				if(profile.wishList != ''){
					$('#add-wishlist').append('<input type="hidden" name="wishlistId" value="' + profile.wishList + '"></input><input type="submit" id="wishlist-button" class="submit-light" value="Add To Wish List" />');
				}
				if(profile.giftLists != ''){
					if (profile.giftLists.length == 1) {
						$('#add-registry').append('<div id="registry-single"><input type="hidden" id="registryId" name="registryId" value="' + profile.giftLists[0].id + '"></input><input type="submit" id="registry-button" class="submit-light" value="Add To Registry" /></div>');
					} else {
						registrySelect ='<div id="registry-select"><fieldset class="inlinseSets"><label>Select a registry</label><div class="registry-select-group"><select name="registryId" id="registryId">';
						for (x = 0; x < profile.giftLists.length; x++) {
							registrySelect += '<option value="' + profile.giftLists[x].id + '">'+ profile.giftLists[x].eventType +'</option>';
						}
						registrySelect += '</select><input type="submit" id="registry-button" class="submit-light" value="Add To Registry" /></div></fieldset>';
						$('#add-registry').append(registrySelect).show();
					}
				} else {
					$('#add-registry').append('<div id="registry-single" class="register-upsell"><a href="/modal/benefits-of-registration.jsp?tab=3" class="modal-trigger" ><button class="submit-light">Add To Registry</button></a></div>');
				}
			});
		} else {
			$(document).ready(function(){
				$('#add-wishlist').append('<a href="/modal/benefits-of-registration.jsp?tab=2" class="modal-trigger" ><button class="submit-light">Add To Wish List</button></a>');
				$('#add-registry').append('<div id="registry-single" class="register-upsell"><a href="/modal/benefits-of-registration.jsp?tab=3" class="modal-trigger" ><button class="submit-light">Add To Registry</button></a></div>');
			});
		}
	}
}

// promo banner
function getPromoBanner(){
	$.ajax({
		url: '/sitewide/includes/header/expanding-banner-controller.jsp?categoryId='+categoryId+'&section='+section+'&subsection='+subsection,
		dataType: 'html',
		cache: false,
		success: function(data) {
			if (data.length > 0) {
				$(document).ready(function(){
					$('#promo-container').html(data);
				});
			}
		}
	});
}


/* ADD THIS */
var addthis_config = {
	ui_header_color: "#ffffff",
	ui_header_background: "#958e8a",
	ui_delay: "100",
	ui_click: true,
	ui_use_css: true,
	ui_use_addressbook: true,
	services_compact: 'email, google, digg, favorites, gmail, aol mail, print, more',
	services_expanded: 'email, facebook, twitter, google, typepad, digg, stumbleupon, blogger, wordpress, favorites, gmail, aol mail, y! mail, amazon, print'
}
function sessionScrub(){
	var thisURL = document.location.href,
		firstHalf, secondHalf;
	if(thisURL.indexOf(";jsessionid=") == -1){
		return thisURL;
	}else{
		firstHalf = thisURL.split(';')[0];
		if(thisURL.indexOf('?') == -1){
			return firstHalf;
		}else{
			secondHalf = thisURL.split('?')[1];
			return firstHalf + "?" + secondHalf;
		}
	}
}

/* EQUAL HEIGHTS FUNCTION */
function eqHeights(mod) {
	var maxHeight = 0;
	var eqMod = $(mod);
	eqMod.each(function () { 
		// Store the highest value
		modHt = $(this).height();
		if (modHt > maxHeight) {
			maxHeight = $(this).height();
		}
	});
	// Set the height
	eqMod.height(maxHeight);
}
function multipleHeights(bigMod, smallSet, smallVariable, form) {
	var bigHeight = $(bigMod).height(); 
	var formPos = $(form).position();
	// Get form height plus padding in cased it's changed
	var formHeight = Math.round($(form).height() + formPos.top);
	if (formHeight > bigHeight){
		$(bigMod).height(formHeight);
	}
	bigHeight = $(bigMod).height(); // Recalculate single mod height in case
									// it's changed
	var smallVar = $(smallVariable).height();
	var fixedHeight = 0;
	var divCount = $(smallSet).length; // Number of modules with a height we're
										// not going to change
	$(smallSet).each(function(index) { // Adds heights of these modules
		ht = $(this).height();
		fixedHeight = fixedHeight + ht;
	});
	var varHeight = bigHeight-fixedHeight;// Height of module we're going to
											// change
	var pad = (divCount*21);
	var calcHeight = smallVar + fixedHeight + pad;
	if (bigHeight >= calcHeight) {
		$(smallVariable).height(varHeight-pad);// Height adjusted for padding
												// and borders
	} else {
		$(bigMod).height(calcHeight);
	}
}

/* CHARACTER COUNTDOWN FUNCTION */
function characterCount(input, maxLength, alertText){
	// get current number of characters
	var goodValue;
	$(input).each(function() {
		// update characters
		$(this).focus(function() {
			var length = $(this).val().length;
			$(this).after('<span>' + (maxLength-length) + ' ' + alertText + '</span>');
		});
		$(this).blur(function() {
			$(this).next('span').remove();
		});
		
		// bind on key up event
		$(this).keyup(function(){
			// get new length of characters
			var new_length = $(this).val().length;
			if (new_length<maxLength){
				$(this).next('span').removeClass('error');
			}
			else if (new_length == maxLength) {
				$(this).next('span').addClass('error');
				goodValue = $(this).val();
			}else {
				$(this).val(goodValue);
			}
			new_length = $(this).val().length;
			// print
			$(this).next('span').html((maxLength-new_length) + ' ' + alertText);

		});
	});
}

/* FORM HELPERS */
function formStyles(field){
	$(field).each(function() {
		if ($(this).val() != "") {$(this).addClass('fieldHighlight');}
		});
		$(field).focus(function() {
			$(this).addClass('fieldHighlight');
		});
		$(field).blur(function() {
			if ($(this).val() != "") {$(this).addClass('fieldHighlight');}
			else {$(this).removeClass('fieldHighlight');}
		});
}
// inline labels and form handling
$('span.inline-label').live('focus', function(event) {
	$('label', this).hide(); 
});
$('span.inline-label').live('blur', function(event) {
	var value = $('input', this).val();
	if (value == ""){
		$('label', this).show();
	}
});
$('form.hasrequired').live('submit', function(event) {
	var submitReady = true;
	$(this).find('input.required').each(function(){
		var input = $(this).val();
		var title = $(this).attr('title');
		if (input==""){
			$(this).prev('label').html(title);
			$(this).prev('label').show();
			$(this).bind('keypress', function(event) {
				$(this).prev('label').hide();
				$(this).unbind(event);
			});
			submitReady = false;
		}
	});
	return submitReady;
});

// For Contact Us Page
function contactTopics() {
	$('#topic').change(function() {
		$('#topic option:selected').each(function() {
			var topic = $(this).attr('id');
			$('.topic-info.selected').addClass('hidden').removeClass('selected');
			$('#'+topic+'-info').removeClass('hidden').addClass('selected');
		});
	});
}

/* open a faq from an anchor link */
function openFaq(id){
	$(id).parent().next('dd').show();
}

/* MINI CART OBJECT */
var miniCart = {
		miniCartWindow: '#mini-cart',
		miniCartTrigger: '#util-cart',
		mcLoad : function () {
			var $miniCartTrigger = $(this.miniCartTrigger),
				$miniCartWindow = $(this.miniCartWindow),
				triggerPos = $miniCartTrigger.offset(),
				triggerHeight = $miniCartTrigger.height();
			if ($miniCartWindow.html().length > 0) {
				$miniCartTrigger.addClass('selected'); 
				$miniCartWindow.css({top: triggerPos.top + triggerHeight}).show();
			} else { 
				$miniCartWindow.bgiframe();
				$miniCartTrigger.addClass('selected');
				$miniCartWindow.css({top: triggerPos.top + triggerHeight}).addClass('loading').show();
				$.ajax({
					url: '/modal/mini-cart.jsp', 
					type: 'GET', 
					dataType: 'html', 
					cache: false,
					success: function (data) {
						miniCart.mcShow(data);
					},
					error: function (XMLHttpRequest, textStatus, errorThrown) {
						// no response
					}
				});
			}
			return false;
		},
		mcShow : function (data) { // function to show miniCart
			$(this.miniCartWindow).removeClass('loading').html(data);
		},
		mcHide : function () {// function to hide mini cart. Does not erase
								// mini cart contents.
			$(this.miniCartTrigger).removeClass('selected'); 
			$(this.miniCartWindow).hide();
		},
		mcUpdate : function (count) {// function to update cart count if new
										// item is added.
			$(this.miniCartTrigger + ' > a ').html('Cart (' + count + ')');
			$(this.miniCartWindow).empty();
		},
		mcClear : function () {// function to update cart count if new item is
								// added.
			$(this.miniCartWindow).empty();
		}
	};

/* ROOM GALLERY SLIDESHOW */
var roomGallery = {
	galleryData: {},
	galleryRoomData: [],
	galleryApi: {},
	slideNavApi: {},
	$galleryNavigation: {},
	$slideNavigation: {},
	$gallerySlides: {},
	slideHeight: 608,
	thumbHeight: 110,
	slideIndex: 0,
	galleryIndexArray: [],
	slideLoadStatus: {},
	$slideNavPrev: {},
	$slideNavNext: {},
	lastSlideId: '',
	init : function () {
		var self = this;
			hash = "";
		this.$slideNavigation = $('#slide-navigation');
		this.$gallerySlides = $('#gallery-slides');
		this.$galleryNavigation = $('#gallery-navigation');
		this.$slideNavPrev = $('.prev', this.$slideNavigation);
		this.$slideNavNext = $('.next', this.$slideNavigation);
		this.galleryRoomData = this.getGalleryRoomData();
		this.galleryData = this.getGalleryData();
		this.rehash();
		hash = this.getHash();
		if (hash.length == 0){
			this.setHash();
		}
		this.galleryApi = $(".scrollable", self.$gallerySlides).scrollable({circular: true}).navigator({navi: "#slide-navigation .scrollable", naviItem: 'a', activeClass: 'selected', history: true}).data("scrollable");
		this.slideNavApi = $(".scrollable", self.$slideNavigation).scrollable({circular: false, prev: '.none', next: '.none'}).data("scrollable");
		this.fixSlideHeights();
		this.galleryIndexArray = this.getGalleryIndexArray();

		//listeners
		this.galleryApi.onSeek(function () {
			var slideIndex = this.getIndex();
			if (slideIndex > -1){
				self.slideIndex = this.getIndex();
				self.loadRoom(self.galleryRoomData[self.slideIndex].id);
				self.highlightActiveRoom();
				self.$slideNavPrev.toggleClass('disabled', self.slideNavApi.getIndex() == 0);
				self.$slideNavNext.toggleClass('disabled', self.slideNavApi.getIndex() == self.slideNavApi.getSize() - 1 || self.slideNavApi.getSize() < 5);
				self.trackPageView();
				self.setHash();
			}
		});
		this.$galleryNavigation.click(function (e) {
			var $target = $(e.target),
				thisIndex = $('a', self.$galleryNavigation).index($target),
				slideNavIndex = self.galleryIndexArray[thisIndex],
				slideIndex = self.galleryIndexArray[thisIndex];
			self.changeSlide(slideNavIndex, slideIndex);
			return false;
		});
		this.$slideNavigation.click(function (e) {
			var $target = $(e.target),
				curSlideIndex = self.galleryApi.getIndex(),
				curSlideNavIndex = self.slideNavApi.getIndex(),
				slideIndex = null,
				slideNavIndex = null;
			if ($target.hasClass('next-page')) {
				slideNavIndex = slideIndex = curSlideNavIndex + 5;
			} else if ($target.hasClass('prev-page')) {
				slideNavIndex = (curSlideNavIndex - 5 < 0) ? 0 : curSlideNavIndex - 5;
				slideIndex = (curSlideNavIndex - 1 < 4) ? 0 : curSlideNavIndex - 1;
			} else {
				if (curSlideIndex >= curSlideNavIndex + 5 || curSlideIndex < curSlideNavIndex) {
					slideNavIndex = curSlideIndex;
				} 
			}
			self.changeSlide(slideNavIndex, slideIndex);
			return false;
		});
		this.$gallerySlides.click(function (e) {
			var $target = $(e.target),
				curSlideIndex = self.galleryApi.getIndex(),
				curSlideNavIndex = self.slideNavApi.getIndex(),
				slideIndex = null,
				slideNavIndex = null;
			if ($target.hasClass('next-slide') && curSlideIndex >= curSlideNavIndex + 5){
				slideNavIndex = curSlideNavIndex + 5;
			} else if ($target.hasClass('prev-slide') && curSlideIndex < curSlideNavIndex){
				slideNavIndex = (curSlideNavIndex - 5 < 0)?0:curSlideNavIndex - 5;
			}
			self.changeSlide(slideNavIndex, slideIndex);
			return false;
		});
		
		$('.cloned').attr('id','');
	},
	changeSlide : function (slideNavIndex, slideIndex) {
		if (slideNavIndex !== null) {
			this.slideNavApi.seekTo(slideNavIndex);
		}
		if (slideIndex !== null) {
			this.galleryApi.seekTo(slideIndex);
		}
	},
	rehash : function () {
		var self = this;
		$('.scrollable a', this.$slideNavigation).each(function(i){
			var hash = "#"+ self.galleryRoomData[i].galleryId +"/" + self.galleryRoomData[i].id;
			$(this).attr('href',hash);
		});
		
	},
	setHash : function (galleryId, slideId){
		var newHash = "",
			initialHash = "";
		if (galleryId != null && slideId != null) {
			newHash = "#" + galleryId + "/" + slideId;
		} else {
			newHash = "#" + this.galleryRoomData[this.slideIndex].galleryId + "/" + this.galleryRoomData[this.slideIndex].id;
		}
		if (window.location.hash == "") {
			initialHash = "#" + this.galleryRoomData[0].galleryId + "/" + this.galleryRoomData[0].id
			if (newHash != initialHash){
				window.location.hash = newHash;
			}
		} else if (window.location.hash != newHash){
				window.location.hash = newHash;
		}
	},
	getHash : function(){
		var hashArray = [];
		if(window.location.href.indexOf('#') > 0){
			hashArray = (document.location.href.split('#')[1]).split('/');
		} 
		if (hashArray.length == 0){
			var getparams = getUrlVars();
			if (getparams.id != undefined && getparams.id != "") {
				hashArray[0] = getparams.id;
				if (getparams.slideId != undefined && getparams.slideId != "") {
					hashArray[1] = getparams.slideId;
				} else {
					if (this.galleryData[getparams.id] != undefined){
						var slideIndex = this.galleryData[getparams.id].slideIndex;
						hashArray[1] = this.galleryRoomData[slideIndex].id;
					}
				}
				this.setHash(hashArray[0],hashArray[1]);
			}
		}
		return hashArray;
	},
	getGalleryRoomData : function(){
		var galleryRoomData = [];
		var galleryIndex = -1;
		var galleryId = "";
		$('.item', this.$gallerySlides).each(function(){
			var roomData = {},
				$this = $(this);
			roomData.id = $this.attr('data-slideid');
			roomData.title = $this.attr('data-title');
			roomData.galleryId = $this.attr('data-galleryId');
			if(roomData.galleryId != galleryId){
				galleryId = roomData.galleryId;
				galleryIndex++;
			}
			roomData.galleryIndex = galleryIndex;
			galleryRoomData.push(roomData);
		});
		return galleryRoomData;
	},
	getGalleryData : function(){
		var galleryData = {};
		$('li', this.$galleryNavigation).each(function(){
			var $this = $(this);
			galleryData[$this.attr('data-galleryId')] = $this.attr('data-title');
		});
		return galleryData;
	},
	highlightActiveRoom : function(){
		var galleryIndex = this.galleryRoomData[this.slideIndex].galleryIndex;
		selectItemByIndex(galleryIndex, '.scrollable-title a');
	},
	getGalleryIndexArray : function (){
		var galleryIndexArray = [];
		var galleryId = "";
		var i=0;
		for (i; i< this.galleryRoomData.length; i++){
			if(this.galleryRoomData[i].galleryId != galleryId){
				galleryIndexArray.push(i);
				galleryId = this.galleryRoomData[i].galleryId;
				this.galleryData[galleryId].slideIndex = i;
			}
		}
		return galleryIndexArray;
	},
	loadRoom : function(slideId){
		var self = this;
		var galleryURL = '/rooms/image-lifestyle-data.jsp?id=' + slideId;
		if (this.slideLoadStatus[slideId] != true){
			self.slideLoadStatus[slideId] = true;
			$.ajax({
				url: galleryURL,
				dataType: 'html',
				cache: true,
				success: function(data) {
					$('.lifestyle-container', '#slide-'+slideId).append(data).lifestyleDisplay();
				},
				error: function() {
					self.slideLoadStatus[slideId] = false;
				}
			});
		}
	},
	trackPageView : function (){
		var slideIndex = this.slideIndex,
			roomName = this.galleryRoomData[slideIndex].title,
			roomId = this.galleryRoomData[slideIndex].id,
			galleryId = this.galleryRoomData[slideIndex].galleryId,
			galleryName = this.galleryData[galleryId];
		if (this.lastSlideId != roomId){
			var cmRoom= (roomName !='')?'Room: ' + roomName:'Room: ' + roomId;
			var cmGallery = (galleryName !='')?'Gallery: ' + galleryName:'Gallery: ' + galleryId;
			try {
				cmCreatePageviewTag(cmRoom, null, cmGallery);
			} catch (e) {
				// coremetrics is off
			}
			try {
				_gaq.push(['_trackPageview', '/rooms/?id='+galleryId+'&slideid='+roomId]);
			}
			catch(e){
				// GA is off
			}
			this.lastSlideId = roomId;
		}
	},
	fixSlideHeights : function() {
		var self = this;
		$('.scrollable img:first', this.$slideNavigation).load(function () {
			self.thumbHeight = $(this).parents('.thumbnail').height();
			$('.scrollable-wrapper',  self.$slideNavigation).height(self.thumbHeight);
			$('.thumbnail', self.$slideNavigation).height(self.thumbHeight);
		}).each(function () {
			if(this.complete || (jQuery.browser.msie && parseInt(jQuery.browser.version) == 6)){
				$(this).trigger("load");
			}
		}); 
		$('.scrollable img:first', this.$gallerySlides).load(function () {
			self.slideHeight = $(this).parents('.slide').height();
			$(self.$gallerySlides).height(self.slideHeight);
			$('.slide', self.$gallerySlides).height(self.slideHeight);
			self.changeSlide(self.slideIndex, self.slideIndex);
		}).each(function () {
			if(this.complete || (jQuery.browser.msie && parseInt(jQuery.browser.version) == 6)){
				$(this).trigger("load");
			}
		});
	}
};


/* OVERLAY */
function Overlay() {
	this.showIframe = (($.browser.msie) && ($.browser.version == "6.0")) ? true:false;
	this.overlayDiv = $('<div class="overlay"></div>').css({'height': '100%', 'width': '100%', 'position': 'fixed', 'left': '0', 'top': '0', 'opacity': '.5', 'filter': 'alpha(opacity = 50)'});
	this.iframe = $('<iframe src="javascript:false; document.write(\'\');"></iframe>').css({'opacity': '0', 'filter': 'alpha(opacity = 0)', 'position': 'absolute', 'top': '0', 'left': '0', 'z-index': '-1', 'width': '100%', 'height': '100%' });
	this.state = false;
	return this;
}
Overlay.prototype = {
	show : function () {
		if (!this.state) {
			if (this.showIframe) {
				this.overlayDiv.css({'position': 'absolute', 'height': $(document).height(), 'width': '100%', 'z-index': 2999 + $('.overlay:visible').size() * 2}).prepend(this.iframe).prependTo('body');
			} else {
				this.overlayDiv.css({'z-index': 2999 + $('.overlay:visible').size() * 2}).prependTo('body');
			}
			this.state = true;
		}
	},
	hide : function () {
		if (this.state) {
			this.overlayDiv.empty().remove();
			this.state = false;
		}
	},
	getEl : function () {
		return this.overlayDiv;
	}
};

/* LOADING MESSAGE */
function LoadingScreen() {
	this.loaderDiv = $('<div class="loading"></div>');
	this.state = false;
}
LoadingScreen.prototype = {
	show : function (targetEl) {
		if (!this.state) {
			var $target;
			if (targetEl !== undefined) {
				$target = $(targetEl);
				this.loaderDiv.css({'width':$target.width(), 'height':$target.height()});
			} else {
				$target = $('body');
			}
			this.loaderDiv.appendTo($target);
			this.state = true;
		}
	},
	hide : function () {
		if (this.state) {
			this.loaderDiv.remove();
			this.loaderDiv.css({'width':'100%', 'height':'100%'});
			this.state = false;
		}
	},
	getEl : function () {
		return this.loaderDiv;
	}
};

/* MODAL WINDOW */
function ModalWindow(options) {
	this.settings = {
			closeClass: 'close',
			title: false,
			loadingClass: 'loading'
		};
	if (options) { 
		$.extend(this.settings, options);
	}
	this.overlayObj = new Overlay();
	this.overlayEl = this.overlayObj.getEl();
	this.loadingObj = new LoadingScreen();
	this.modalDiv = $('<div id="container-modal"></div>');
	this.status = false;
}

ModalWindow.prototype = {
	show : function (options) {
		var self = this;
		if (options != undefined && (options.url != undefined || options.content != undefined)) {
			if (!this.status) {
				this.overlayObj.show();
				this.showLoader(this.overlayEl);
				this.modalDiv.css({'z-index':2999 + ($('.overlay:visible').size()*2 -1),'visibility':'hidden','display':'block','top':'0','left':'0'}).insertAfter(this.overlayEl);
			} else {
				this.showLoader(this.modalDiv);
			}
			
			if (options.url != undefined) {
				$.ajax({
						url: options.url,
						success: function (pageData) {self.loadContent(pageData);},
						dataType: 'html',
						error: function (pageData) {self.loadContent(ajaxError);}
					});
			} else if (options.content != undefined) {
				self.loadContent(options.content);
			}
		} else {
			if (!this.status) {
				this.reposition();
				this.overlayObj.show();
				this.modalDiv.css({'z-index':3000 + $('.overlay:visible').size()*2}).insertAfter(this.overlayEl).show();
				this.overlayEl.click(function(){
					self.hide();
				});
				this.modalDiv.click(function(e){
					var $target = $(e.target);
					if($target.hasClass(self.settings.closeClass)){
						self.hide();
						return false;
					}
				});
				this.status = true;
			}
		}
	},
	hide : function () {
		this.modalDiv.hide().empty();
		this.overlayObj.hide();
		this.status = false;
	},
	showLoader : function ($target){
		if (!$target) {
			$target = this.modalDiv;
		}
		this.loadingObj.show($target);
	},
	hideLoader : function (){
		this.loadingObj.hide();
	},
	loadContent : function (data){
		var self = this;
		if (!self.status) { // not already open
			self.modalDiv.html(data);
			self.reposition();
			self.loadingObj.hide();
			self.modalDiv.css({'visibility': 'visible'});
			self.overlayEl.click(function(){
				self.hide();
			});
			self.modalDiv.click(function(e){
				var $target = $(e.target);
				if($target.hasClass(self.settings.closeClass)){
					self.hide();
					return false;
				}
			});
			self.status = true;
		} else {
			self.modalDiv.html(data);
			self.reposition();
			self.loadingObj.hide();
		}
	},
	reposition : function () {
		var $content = $('#content', this.modalDiv),
			$actions = $('.modal-actions', this.modalDiv),
			$title = $('.modal-title', this.modalDiv),
			vWidth = window.innerWidth ? window.innerWidth : $(window).width(),
			vHeight = window.innerHeight ? window.innerHeight : $(window).height(),
			overflow = $content.css('overflow'),
			modalWidth = this.modalDiv.width(),
			modalHeight = this.modalDiv.height(),
			contentWidth = $content.width(),
			contentHeight = $content.height(),
			actionsHeight = $actions.height(),
			titleHeight = $title.height(),
			marginLeft = '0',
			marginTop = '0',
			topPos = '50%',
			leftPos = '50%';
		if (modalWidth >= vWidth*0.9){
			$content.css({'width':vWidth*0.9});
		}
		if (modalHeight >= vHeight*0.9 && overflow == 'auto'){
			if (vHeight*0.9 - actionsHeight - titleHeight > 130){
				$content.css({'height':(vHeight*0.9 - actionsHeight - titleHeight)});
				if ($.browser.msie){
					$content.css({'padding-right' : '20px', 'overflow-x' : 'hidden'});
				}
			} 
		} 
		if (modalHeight < vHeight){
			marginLeft = 0-(this.modalDiv.width()/2);
			marginTop = 0-(this.modalDiv.height()/2)+$(document).scrollTop();
		} else {
			marginLeft = 0-(this.modalDiv.width()/2);
			if (overflow == 'auto'){
				topPos = $(document).scrollTop()+10;
			} else {
				topPos = $(document).scrollTop();
			}
		}
		this.modalDiv.css({'margin-left':marginLeft,'margin-top':marginTop,'top':topPos,'left':leftPos});
	}
};

/* QUICK VIEW OBJECT */
var quickView = {
	container:new ModalWindow(),
	$content:null,
	$trigger:$('<div id="quickview-trigger"><div id="quickview-screen"></div><a class="submit" >Quick View</a></div>'),
	triggerState:false,
	triggerID:0,
	
	/* display the quick view button */
	showLauncher: function(config){
		var productId = config.productId,
			type = (config.type !== undefined)?config.type:"",
			skuId = (config.skuId !== undefined)?config.skuId:"",
			swatchId = (config.swatchId !== undefined)?config.swatchId:"",
			el = config.el;
		if (!productId || !el)return false;
		if (this.triggerID != productId){
			var offset = $(el).offset(),
				imgWidth=$(el).width(),
				imgHeight=$(el).height();
				el.boundingBox = {t:offset.top, r:offset.left + imgWidth, b:offset.top + imgHeight, l:offset.left};
			if (this.triggerState){
				this.hideLauncher();
			}
			this.$trigger.appendTo(el);
			this.triggerState = true;
			this.triggerID = productId;
			this.$trigger.mouseout(function(e){
				if (e && el.boundingBox && !mouseTest(e.pageX, e.pageY, el.boundingBox)) {
					return;
				}
				quickView.$trigger.unbind('mouseout');
				quickView.hideLauncher();
			});
			$(el).mouseout(function(e){
				if (e && el.boundingBox && !mouseTest(e.pageX, e.pageY, el.boundingBox)) {
					return;
				}
				$(el).unbind('mouseout');
				quickView.hideLauncher();
			});
			this.$trigger.click(function(){
				quickView.launch({'productId':productId, 'type':type, 'skuId':skuId, 'swatchId':swatchId});
				quickView.hideLauncher();
			});
		}
	},
	/* hide the quick view button */
	hideLauncher: function(){
		quickView.$trigger.remove();
		quickView.triggerState = false;
		quickView.triggerID = 0;
	},
	/* launch load content and open quick view window */
	launch: function(config){
		var qvUrl = '/modal/quickview.jsp?productId=';
		if (config.productId != null){
			qvUrl += config.productId;
			qvUrl += '&type=' + config.type;
			
			if (config.skuId != "") {
				qvUrl += '&skuIds=' + config.skuId;
			}
			if (config.swatchId != "") {
				qvUrl += '&swatchId=' + config.swatchId;
			}
			if(dialog.status === true){
				dialog.hide();
			}
			
			this.container.show({'url':qvUrl});
			
		} else {
			return false;
		}
	},
	close: function(){
		this.container.hide();
	},
	getStatus: function() {
		return this.container.status;
	}
};

/* Product Zoom Object */
var productZoom = {
	container:new ModalWindow(),
	$content:null,
	$trigger:$('<div id="zoom-trigger"><a class="submit">Click to Zoom</a></div>'),
	triggerState:false,
	triggerID:'',
	
	/* display the zoom button */
	showLauncher: function(config){
		var elId = config.elId,
			el = config.el,
			url = config.url;
		if (!elId || !el)return false;
		if (this.triggerID != elId){
			var offset = $(el).offset(),
				imgWidth=$(el).width(),
				imgHeight=$(el).height();
				el.boundingBox = {t:offset.top, r:offset.left + imgWidth, b:offset.top + imgHeight, l:offset.left};
			if (this.triggerState){
				this.hideLauncher();
			}
			this.$trigger.appendTo(el);
			this.triggerState = true;
			this.triggerID = elId;
			this.$trigger.mouseout(function(e){
				if (e && el.boundingBox && !mouseTest(e.pageX, e.pageY, el.boundingBox)) {
					return;
				}
				productZoom.$trigger.unbind('mouseout');
				productZoom.hideLauncher();
			});
			$(el).mouseout(function(e){
				if (e && el.boundingBox && !mouseTest(e.pageX, e.pageY, el.boundingBox)) {
					return;
				}
				$(el).unbind('mouseout');
				productZoom.hideLauncher();
			});
			this.$trigger.click(function(){
				productZoom.launch({'url':url});
				productZoom.hideLauncher();
			});
		}
	},
	/* hide the zoom button */
	hideLauncher: function(){
		productZoom.$trigger.remove();
		productZoom.triggerState = false;
		productZoom.triggerID = '';
	},
	/* launch load content and open zoom window */
	launch: function(config){
		if (config.url != null){
			if(dialog.status === true){
				dialog.hide();
			}
			this.container.show({'url':config.url});
		} else {
			return false;
		}
	},
	close: function(){
		this.container.hide();
	},
	getStatus: function() {
		return this.container.status;
	}
};

// PRODUCT MODAL FUNCTIONS
function removeOverlay() {
	if (quickView.getStatus() !== true) {
		dialog.hide();
	} 
}
function showOverlay() {
	if (quickView.getStatus() !== true) {
		dialog.overlayObj.show();
		dialog.loadingObj.show(dialog.overlayEl);
	} else {
		quickView.container.showLoader();
	}
}

// PERSONALIZATION
// determines the copy of instructional text given min max values
function instructionalText(min, max) {
	var textOutput;
	if (min == max) {
		if (min == 1) {
			textOutput = '(enter 1 character)';
		} else {
			textOutput = '(enter '+min+' characters)';
		}
	} else {
		textOutput = '(enter '+min+'-'+max+' characters)';
	}
	if (max == 3) {
		textOutput += '<br/><span class="subtle">For a three-letter monogram with a large middle initial, that middle initial traditionally represents the last name. The first and the last initials represent the first name and middle (or maiden) name, respectively.</span>';
	} 
	return textOutput;
}
// shows text fields and instructions
function selectScript(container, $target){
	var $line1container = $('.line1', container),
		$line2container = $('.line2', container),
		$line3container = $('.line3', container),
		
		$line1 = $('input.line1-text', container),
		$line2 = $('input.line2-text', container),
		$line3 = $('input.line3-text', container),
		
		$line1instructions = $('.instructions', $line1container),
		$line2instructions = $('.instructions', $line2container),
		$line3instructions = $('.instructions', $line3container),
		
		$line1label = $('label', $line1container),
		$option = $('option:selected', $target),
		maxLength = $option.attr('data-maxLength'),
		minLength = $option.attr('data-minLength'),
		numberOfLines = $option.attr('data-numberOfLines'),
		hasPreview = ($option.attr('data-haspreview')=='true')?true:false;
	
	// only show link if this script has a preview
	$('.instructions a', container).attr('href', '/modal/monogram-letters.jsp?monogramLayoutId=' + $target.val()).toggle(hasPreview);
	
	// delete values if previous specs does not equal new specs
	if ($line1.attr('minLength') !== undefined && $line1.attr('maxLength') != maxLength) {
		$line1.val('');
		$line2.val('');
		$line3.val('');
	}
	// set line 1 input to the maxLength & minLength
	$line1.attr('maxLength', maxLength)
		.attr('minLength', minLength)
		.attr('size', maxLength)
		.removeAttr('disabled'); // as long as a script is selected, always
									// enable line 1
	
	// change out the line 1 instructional copy
	$line1instructions.html(instructionalText(minLength, maxLength));
	// multi-line?
	$line1label.html('Text');

	if (numberOfLines == 1) {
		$line2container.hide();
		$line2.val('').attr('disabled','disabled'); 
		$line3container.hide();
		$line3.val('').attr('disabled','disabled'); 
	}	else if(numberOfLines == 2) { 
		$line2container.show();
		$line2.attr('maxLength', maxLength).removeAttr('disabled');
		$line2instructions.html(instructionalText(0, maxLength));
		$line3container.hide();
		$line3.val('').attr('disabled','disabled'); 
	} else if(numberOfLines == 3){
		$line2container.show();
		$line2.attr('maxLength', maxLength).removeAttr('disabled');
		$line2instructions.html(instructionalText(0, maxLength));
		$line3container.show();
		$line3.attr('maxLength', maxLength).removeAttr('disabled');
		$line3instructions.html(instructionalText(0, maxLength));
	}
	$line1.focus();
}

/* SWATCH DATA CONTROLLER */
var SwatchModel = function (data) {
	var swatchData = (data) ? data:{};
	return {
		get: function (swatchId) {
			return swatchData[swatchId];
		}
	};
};

/* SWATCH CONTROLLER */
SwatchGroup = function(){
	
}
/* IMAGE CONTROLLER */
var ProductImage = function ($container) {
	this.$imageContainer = $container;
	this.$zoomLink = $('.zoom-link', this.$imageContainer);
	this.$mainImage = $('.main-photo', this.$imageContainer);
	this.$altImages = $('.alternate-photo', this.$imageContainer);
	this.$thumbnails = $('li', this.$imageContainer);
	this.defaultZoomUrl = this.$zoomLink.attr('href');
};

ProductImage.prototype = {
	colorizeImage : function (url, swatchId) {
		this.$mainImage.attr('src', url);
		this.updateZoomLink(swatchId);
	},
	updateZoomLink : function (swatchId) {
		var zoomUrl = this.$zoomLink.attr('href'),
			swatchRE = /&swatchId=[0-9a-zA-Z]+$/;
		if (zoomUrl.indexOf('&swatchId') > 0) {
			zoomUrl = zoomUrl.replace(swatchRE, '&swatchId=' + swatchId);
		} else {
			zoomUrl += '&swatchId=' + swatchId;
		}
		this.$zoomLink.attr('href', zoomUrl);
	},
	switchImage : function (thumbIndex) {
		if (this.$thumbnails.length > 0) {
			
			var zoomUrl = this.$zoomLink.attr('href'),
				frameRE = /&initialframe=[0-9]+$/;
			if (this.$mainImage.is(':visible')) {
				this.$mainImage.fadeOut('slow');
				$('#alt-photo' + thumbIndex, this.$imageContainer).fadeIn('slow');
			} else {
				this.$altImages.each(function (i, item) {
					if (i != thumbIndex) {
						$(item).fadeOut('slow');
					} else {
						$(item).fadeIn('slow');
					}
				});
			}
			if (thumbIndex != 0) {
				if (zoomUrl.indexOf('&initialframe=') > 0) {
					zoomUrl = zoomUrl.replace(frameRE, '&initialframe=' + thumbIndex);
				} else {
					zoomUrl += '&initialframe=' + thumbIndex;
				}
			} else if (thumbIndex == 0) {
				zoomUrl = zoomUrl.replace(frameRE, '');
			}
			this.$zoomLink.attr('href', zoomUrl);
			selectItemByIndex(thumbIndex, this.$thumbnails);
			selectItemByIndex(-1, '#product-swatches .swatch-group li');
			try {
				cmCreatePageviewTag(cmProduct + ' (image-' + thumbIndex + ')', null, 'Additional Images');
			} catch (e) {
				// coremetrics is off
			}
		}
	},
	resetImage : function () {
		if (this.$thumbnails.length > 0) {
			if (this.$mainImage.is(':visible') != true) {
				this.$altImages.fadeOut('slow');
				this.$mainImage.fadeIn('slow');
				this.$zoomLink.attr('href', this.defaultZoomUrl);
				selectItemByIndex(0, this.$thumbnails);
				selectItemByIndex(-1, '#product-swatches .swatch-group li');
			}
		}
		this.$zoomLink.attr('href', this.defaultZoomUrl);
	}
};

/* PRODUCT DATA */
var ProductModel = function (data) {
	this.productData = (data) ? data:{};
	this.availability = {}; 
};
ProductModel.prototype = {
	cleanSkuData :function () {
		for (product in this.productData) {
			var maxOptionSize = 0;
			var optionSize = 0;
			var badSkus = [];
			// find option length
			for(var x = 0; x < this.productData[product].skus.length; x++){
				optionSize = Object.size(this.productData[product].skus[x].attributes);
				this.productData[product].skus[x].optionSize = optionSize;
				if (optionSize > maxOptionSize) {
					maxOptionSize = optionSize;
				}
			}
			// find bad skus
			for (var x = 0; x < this.productData[product].skus.length; x++){
				if (this.productData[product].skus[x].optionSize < maxOptionSize){
					badSkus.push(x);
				}
			}
			// kill the bad skus
			if (maxOptionSize == 0 && this.productData[product].skus.length > 1){
				this.productData[product].skus = [];
			}else{
				for (var y = 0; y < badSkus.length; y++){
					this.productData[product].skus.splice(badSkus[y]-y,1);
				}
			}
		}
	},
	get: function (prodId) {
		return this.productData[prodId];
	},
	getSku: function (prodId, skuId) {
		var thisProduct = this.get(prodId);
		for (i = 0; i < thisProduct.skus.length; i++) {
			if (thisProduct.skus[i].catalogRefId == skuId) {
				return thisProduct.skus[i];
			}
		}
	},
	getColorizeType : function(prodId){
		return this.productData[prodId].colorizeType;
	},
	getPrimarySwatchOptions : function(prodId){
		if(this.productData[prodId].primarySwatchOptions !== undefined){
			return this.productData[prodId].primarySwatchOptions;
		} else {
			return false;
		}
	},
	getSecondarySwatchOptions : function(prodId){
		if(this.productData[prodId].secondarySwatchOptions !== undefined){
			return this.productData[prodId].secondarySwatchOptions;
		} else {
			return false;
		}
	},
	getOptionTypes : function (prodId) {
		var firstSkuOptions = this.getSkuOptions(prodId, this.productData[prodId].skus[0].catalogRefId),
			optionTypeArray = [],
			sortedOptionTypeArray = [],
			i,
			optionType;
		
		for (optionType in firstSkuOptions) {
			optionTypeArray.push(optionType);
		}
		if (this.productData[prodId].optionOrder != ""){
			for (i = 0; i < this.productData[prodId].optionOrder.length; i++) {
				if (optionTypeArray.contains(this.productData[prodId].optionOrder[i])){
					sortedOptionTypeArray.push(this.productData[prodId].optionOrder[i]);
				}
			}
			sortedOptionTypeArray.concat(optionTypeArray);
			sortedOptionTypeArray.dedup();
			return sortedOptionTypeArray;
		} else {
			return optionTypeArray;
		}
	},
	getAllOptions: function (prodId) {
		var thisProduct = this.productData[prodId],
			optionTypeArray = this.getOptionTypes(prodId),
			options = {},
			optionType = '',
			optionKey = '',
			sortedSkuArray = [],
			firstChar = '',
			i, x;
		for (i = 0; i < optionTypeArray.length; i++) { // for each type
			optionType = optionTypeArray[i];
			firstChar = thisProduct.skus[0].attributes[optionType].displayName.charAt(0);
			if (firstChar != '$' ){
				sortedSkuArray = thisProduct.skus.sort(prioritySort(optionType));
			} else {
				sortedSkuArray = thisProduct.skus.sort(displayNameSort(optionType));
			}
			for (x = 0; x < sortedSkuArray.length; x++) { // loop though the
															// skus
				if (sortedSkuArray[x].attributes[optionType] !== undefined) { // make
																				// sure
																				// this
																				// option
																				// exists
																				// for
																				// the
																				// sku
					optionKey = sortedSkuArray[x].attributes[optionType].optionId;
					if (options[optionType] === undefined) { // see if we
																// have an
																// object for
																// this type
						options[optionType] = {}; // create the object
						options[optionType][optionKey] = sortedSkuArray[x].attributes[optionType]; // populate
					} else if (options[optionType][optionKey] === undefined) { // see
																				// if
																				// this
																				// value
																				// already
																				// exists
						options[optionType][optionKey] = sortedSkuArray[x].attributes[optionType]; // populate
					}
				}
			}
		}
		
		return options;
	},
	getFilteredOptions: function (prodId, selectedOptions) {
		var optionTypeArray = this.getOptionTypes(prodId),
			tmpArray = [],
			allSkus = this.productData[prodId].skus,
			filteredSkuArray,
			options = {},
			optionType = '',
			optionKey = '',
			i, j, k, selectedOptionType;
		/*
		 * For each selector (option type), filter down the matching skus for
		 * the other selectors' selected elements. From the filtered sku set,
		 * get back all available options for this option type
		 */
		for (i = 0; i < optionTypeArray.length; i++) {
			optionType = optionTypeArray[i];
			filteredSkuArray = allSkus;
			for (selectedOptionType in selectedOptions) {
				if (selectedOptionType != optionType) {
					for (j = 0; j < filteredSkuArray.length; j++) {
						if (filteredSkuArray[j].attributes[selectedOptionType] !== undefined) {
							if (filteredSkuArray[j].attributes[selectedOptionType].optionId == selectedOptions[selectedOptionType]) {
								tmpArray.push(filteredSkuArray[j]);
							}
						}
					}
					filteredSkuArray = tmpArray;
					tmpArray = [];
				}
			}
			for (k = 0; k < filteredSkuArray.length; k++) {
				if (filteredSkuArray[k].attributes[optionType] !== undefined) {
					optionKey = filteredSkuArray[k].attributes[optionType].optionId;
					if (options[optionType] === undefined) { 
						options[optionType] = {};
						options[optionType][optionKey] = filteredSkuArray[k].attributes[optionType]; 
					} else if (options[optionType][optionKey] === undefined) { 
						options[optionType][optionKey] = filteredSkuArray[k].attributes[optionType]; 
					}
				}
			}
		}
		return options;
	},
	getSkuOptions: function (prodId, skuId) {
		var thisProduct = this.get(prodId),
			options = {},
			i, j;
		for (i = 0; i < thisProduct.skus.length; i++) {
			if (thisProduct.skus[i].catalogRefId == skuId) {
				for (j in thisProduct.skus[i].attributes) {
					if (options[j] === undefined) {
						options[j] = thisProduct.skus[i].attributes[j].optionId;
					}
				}
				break;
			}
		}
		return options;
	},
	getFilteredSkus: function (prodId, selectedOptions) {
		var tempArray = [], 
			tmpSkuArray = this.productData[prodId].skus,
			optionType,
			i;
		for (optionType in selectedOptions) {
			for (i = 0; i < tmpSkuArray.length; i++) {
				if (tmpSkuArray[i].attributes[optionType] !== undefined && tmpSkuArray[i].attributes[optionType].optionId == selectedOptions[optionType]) {
					tempArray.push(tmpSkuArray[i]);
				}
			}
			tmpSkuArray = tempArray;
			tempArray = [];
		}
		return tmpSkuArray;
	},
	isZipRequired : function (ids) {
	},
	isAddToCartEnabled : function (){
		var enabled = false;
		for (product in this.productData) {
			if (this.productData[product].disabled == 'false'){
				enabled = true;
				break;
			}
		}
		return enabled;
	},
	setDisabled : function (prodId) {
		this.productData[prodId].disabled = 'true';
	},
	getSkuAvailability : function (skuId) {
		var jsonResponse, 
			availabilityMsg;
		if (this.availability[skuId] === undefined || this.availability[skuId].inventoryCode === '') {
			return false;
		}
		return this.availability[skuId];
	},
	setSkuAvailability : function(skuId, productController, skuGroup, updateQty){
		var THIS = this;
		$.ajax({
			url: '/sitewide/data/json/sku-availability.jsp?skuId=' + skuId,
			dataType: 'json',
			success: function(data){
				THIS.availability[skuId] = data;
				productController.updateAvailability(skuGroup, updateQty);
			},
			error: function(){
				productController.showInventoryError(skuGroup, updateQty);
			}
		});
	},
	resetSkuAvailability : function () {
		var k;
		for (k in this.availability) {
			if (this.availability[k].postalCodeSpecific == 'true' || this.availability[k].deliveryCode != '200') {
				// reset inventory values
				this.availability[k].inventoryCode = '';
				this.availability[k].inventoryMessage = '';
			}
		}
	},
	setDefaults : function (skuList) {
		var i, j, product;
		for (i = 0; i < skuList.length; i++) {
			outer: for (product in this.productData) {
				for (j = 0; j < this.productData[product].skus.length; j++) {
					if (skuList[i] == this.productData[product].skus[j].catalogRefId) {
						this.productData[product].defaultSku = skuList[i];
						break outer;
					}
				}
			}
		}
	}
};

var SkuGroup = function (container) {
	// dom
	this.$container = $(container);
	this.$image = $('.item-image img', this.$container);
	this.$zoomLink = $('.item-image a', this.$container);
	this.$qtyInput = $('.qtyInput', this.$container);
	this.$personalizeInput = $('.personalizeInput', this.$container);
	this.$sku = $('.item-sku', this.$container);
	this.$price = $('.item-price', this.$container);
	this.$details = $('.details', this.$container);
	this.$info = $('.item-info', this.$container);
	this.$selectors = [];
	// data
	this.prodId = this.$container.attr('data-productId');
	this.enabled = false;
	this.catalogRefId = '';
	this.origImage = (this.$image.length > 0 )?this.$image.attr('src'):'',
	this.imgBase = (this.$image.length > 0 )?this.origImage.substring(this.origImage.indexOf(s7data.staticHost) + s7data.staticHost.length + 1, this.origImage.indexOf('?')):'';
	
	// new photo controller
	this.$productPhoto = $('.item-image',this.$container);
	this.photoController = null;
	if (this.$productPhoto.length > 0){
		this.photoController = new ProductImage(this.$productPhoto);
	}
};

/* PRODUCT CONTROLLER */
var ProductController = function (productModel, swatchModel, viewContainer, skuIds) {
	this.model = productModel;
	this.swatchModel = swatchModel;
	this.$viewContainer = $(viewContainer);
	this.$swatchContainer = $('#product-swatches', this.$viewContainer);
	this.$thumbContainer = $('#product-photo-thumbs', this.$viewContainer);
	this.$zoomLink = $('#product-photo a', this.$viewContainer);
	this.$altPhotos = $('.alternate-photo', this.$viewContainer);
	this.$productContainer = $("#line-items", this.$viewContainer);
	this.$errorContainer = $('#error-zone-top', this.$productContainer);
	this.$productControls = $('#product-controls', this.$productContainer);
	this.$formContainer = $('#product-form', this.$productContainer);
	this.$lineItems = $('.line-item', this.$productContainer);
	this.$addButton = $('#add-button', this.$productControls);
	this.$postalCodeForm = $('#postalcodeform', this.$productControls);
	this.skuGroups = [];
	this.initialSkuList = skuIds;
	this.postalCodeLabel = 'Enter Zip/Postal Code';
	this.postalCodeUpdateLabel = 'Change Zip/Postal Code';
	this.postalCodeInputs = '<input type="text" id="postal-code" class="postal-code" size="6" maxlength="6" autocomplete="off" tabindex="0" value=""/><input type="submit" value="Enter" class="submit postal-trigger"/>';
	this.standardDeliveryLink = '<a href="/modal/shipping-and-delivery-rates.jsp?tab=2" title="Shipping &amp; Delivery Information" class="modal-trigger delivery-standard" rel="shipping-modal">Standard Delivery Shipping</a>';
	this.furnitureDeliveryLink = '<a href="/modal/shipping-and-delivery-rates.jsp?tab=1" title="Shipping &amp; Delivery Information" class="modal-trigger delivery-furniture" rel="shipping-modal">Unlimited Furniture Delivery</a>';

	// new photo controller
	this.$productPhoto = $('#product-imagery',this.$viewContainer);
	this.photoController = null;
	if (this.$productPhoto.length > 0){
		this.photoController = new ProductImage(this.$productPhoto);
	}
	
	var THIS = this;
	
	// LISTEN
	this.$lineItems.change(function (e) {
		var $target = $(e.target),
			index;
		if ($target.hasClass('attribute')) {
			index = $target.attr('data-index');
			THIS.changeAttribute(index, $target);
		}
	}).click(function (e) {
		var $target = $(e.target),
			index;
		if($target.hasClass('add-trigger')){
			index = $target.attr('data-index');
			selectedSkus = THIS.getSelectedSkus(index);
			if (selectedSkus !== false) {
				itemCount = selectedSkus.length;
				$.ajax({
					url: '/catalog/product/includes/product-form-handler.jsp?type=cart&itemCount='+itemCount,
					dataType: 'html',
					cache: false,
					success: function (data) {
						THIS.$formContainer.html(data);
						$('#addToCart').ajaxSubmit({ 
							clearForm: false,
							dataType: 'html', 
							productGroup: THIS,
							skuArray : selectedSkus,
							success: THIS.handleResponse,
							beforeSerialize: THIS.addToCartUpdate,
							beforeSubmit: showOverlay,
							error: THIS.showError
						});
					},
					error: function () {
						THIS.showError;
					}
				});
			}
		} else if ($target.hasClass('postal-trigger')) {
			var postalCode = $target.siblings('#postal-code').val();
				postalCode = $.trim(postalCode);
			$.ajax({
				url: '/catalog/product/includes/product-form-handler.jsp?type=postal&itemCount=0&postalCode=' + postalCode,
				dataType: 'html',
				cache: false,
				success: function (data) {
					THIS.$formContainer.html(data);
					$('#addToCart').ajaxSubmit({ 
						clearForm: false,
						dataType: 'html', 
						productGroup: THIS,
						success: THIS.handleResponse,
						beforeSubmit: showOverlay,
						error: THIS.showError
					});
				},
				error: function () {
					THIS.showError;
				}
			});
		} else if ($target.hasClass('postalform-trigger-delivery')) {
			$('.item-delivery-message', this).find('.postalcodeform-inline').toggle().end().find('.postalcode-update').toggle();
		} else if ($target.hasClass('postalform-trigger-inventory')) {
			$('.item-inventory-message', this).find('.postalcodeform-inline').toggle().end().find('.postalcode-update').toggle();
		}
		
	}).keypress(function (e) {
		var $target = $(e.target);
		if ($target.hasClass('postal-code')) {
			if (e.which == 13) {
				if ($target.val() != '') {
					var postalCode = $target.val();
						postalCode = $.trim(postalCode);
					$.ajax({
						url: '/catalog/product/includes/product-form-handler.jsp?type=postal&itemCount=0&postalCode=' + postalCode,
						dataType: 'html',
						cache: false,
						success: function (data) {
							THIS.$formContainer.html(data);
							$('#addToCart').ajaxSubmit({ 
								clearForm: false,
								dataType: 'html', 
								productGroup: THIS,
								success: THIS.handleResponse,
								beforeSubmit: showOverlay,
								error: THIS.showError
							});
						},
						error: function () {
							THIS.showError;
						}
					});
				} else {
					THIS.showError(errorMessages.missingPostal);
					return false;
				}
			}
		}
	});
	this.$swatchContainer.click(function (e) {
		var $target = $(e.target);
		if ($target.hasClass('swatch')) {
			THIS.swatchSelect($target);
		}
	}).mouseover(function (e) {
		var $target = $(e.target);
		if ($target.hasClass('detail-trigger')) {
			THIS.swatchOver($target);
		}
	}).mouseout(function (e) {
		var $target = $(e.target);
		if ($target.hasClass('detail-trigger')) {
			THIS.swatchOut($target);
		}
	});
	this.$thumbContainer.click(function (e) {
		var $target = $(e.target),
			thumbIndex;
		if ($target.hasClass('alt')) {
			thumbIndex = $target.attr('data-index');
			THIS.photoController.switchImage(thumbIndex);
		} else if ($target.hasClass('reset')) {
			THIS.photoController.resetImage();
		}
	});
	this.$productControls.click(function (e) {
		var targetId = e.target.id,
			selectedSkus = [],
			registryId = '';
		if (targetId == 'add-button') {
			selectedSkus = THIS.getSelectedSkus();
			if (selectedSkus !== false) {
				itemCount = selectedSkus.length;
				var searchParam = '';
				if (categoryId == 'search') {
					searchParam = '&searchProductId=' + productId;
				}
				$.ajax({
					url: '/catalog/product/includes/product-form-handler.jsp?type=cart&itemCount='+itemCount+searchParam,
					dataType: 'html',
					cache: false,
					success: function (data) {
						THIS.$formContainer.html(data);
						$('#addToCart').ajaxSubmit({ 
							clearForm: false,
							dataType: 'html', 
							productGroup: THIS,
							skuArray : selectedSkus,
							success: THIS.handleResponse,
							beforeSerialize: THIS.addToCartUpdate,
							beforeSubmit: showOverlay,
							error: THIS.showError
						});
					},
					error: function () {
						THIS.showError;
					}
				});
			}
		} else if (targetId == 'wishlist-button') {
			selectedSkus = THIS.getSelectedSkus();
			if (selectedSkus !== false) {
				itemCount = selectedSkus.length;
				$.ajax({
					url: '/catalog/product/includes/product-form-handler.jsp?type=wishlist&itemCount='+itemCount,
					dataType: 'html',
					cache: false,
					success: function (data) {
						THIS.$formContainer.html(data);
						$('#addToCart').ajaxSubmit({ 
							clearForm: false,
							dataType: 'html', 
							productGroup: THIS,
							skuArray : selectedSkus,
							success: THIS.handleResponse,
							beforeSerialize: THIS.addToGiftListUpdate,
							beforeSubmit: showOverlay,
							error: THIS.showError
						});
					},
					error: function () {
						THIS.showError;
					}
				});
			}
		} else if (targetId == 'registry-button') {
			selectedSkus = THIS.getSelectedSkus();
			registryId = $('#registryId', this).val();
			if (selectedSkus !== false) {
				itemCount = selectedSkus.length;
				$.ajax({
					url: '/catalog/product/includes/product-form-handler.jsp?type=giftlist&itemCount='+itemCount + '&registryId=' + registryId,
					dataType: 'html',
					cache: false,
					success: function (data) {
						THIS.$formContainer.html(data);
						$('#addToCart').ajaxSubmit({ 
							clearForm: false,
							dataType: 'html', 
							productGroup: THIS,
							skuArray : selectedSkus,
							success: THIS.handleResponse,
							beforeSerialize: THIS.addToGiftListUpdate,
							beforeSubmit: showOverlay,
							error: THIS.showError
						});
					},
					error: function () {
						THIS.showError;
					}
				});
			}
		} else if (targetId == 'postal-button') {
			itemCount = 0;
			postalCode = $('#postal-code', this).val();
			$.ajax({
				url: '/catalog/product/includes/product-form-handler.jsp?type=postal&itemCount=' + itemCount + '&postalCode=' + postalCode,
				dataType: 'html',
				cache: false,
				success: function (data) {
					THIS.$formContainer.html(data);
					$('#addToCart').ajaxSubmit({ 
						clearForm: false,
						dataType: 'html', 
						productGroup: THIS,
						success: THIS.handleResponse,
						beforeSubmit: showOverlay,
						error: THIS.showError
					});
				},
				error: function () {
					THIS.showError;
				}
			});
		}
	});
};

ProductController.prototype = {
	init : function () {
		var THIS = this,
			prodId, 
			skuGroup, 
			prodData, 
			selectorGroup, 
			defaultSku = '', 
			state, 
			style, 
			defaultSelectedOptions = {},
			skuList = [], 
			x = 0,
			optionType,
			allOptions,
			availableOptions,
			option;
		/* default skus */
		if (this.initialSkuList != ''){
			skuList = this.initialSkuList.split("+");
			this.model.setDefaults(skuList);
		}
		
		/* create skuGroup objects */
		this.$lineItems.each(function (i) {
			var skuGroup = new SkuGroup(this);
			THIS.skuGroups.push(skuGroup);
		});
		/* initialize and update availability */
		for (x = 0; x < this.skuGroups.length; x++) {
			prodId = this.skuGroups[x].prodId;
			skuGroup = this.skuGroups[x];
			prodData = THIS.model.get(prodId);
			if (prodData && prodData.skus.length != 0) {
				if (prodData.defaultSku != '') {
					defaultSelectedOptions = THIS.model.getSkuOptions(prodId, prodData.defaultSku);
					defaultSku = prodData.defaultSku;
				} else if (prodData.skus.length == 1){
					defaultSelectedOptions = THIS.model.getSkuOptions(prodId, prodData.skus[0].catalogRefId);
					defaultSku = prodData.skus[0].catalogRefId;
				} else {
					defaultSelectedOptions = {};
					defaultSku = '';
				}
				allOptions = THIS.model.getAllOptions(prodId);
				availableOptions = THIS.model.getFilteredOptions(prodId, defaultSelectedOptions);
				selectorGroup = '';
				
				for (optionType in allOptions) {
					optionCount = 0;
					
					for (option in allOptions[optionType]) {
						optionCount++; // get length before doing any other
										// processing
					}
					if (optionCount >1){
						selectorGroup += '<fieldset><label class="label">' + optionType + '<\/label><select class="attribute" data-attribute="' + optionType + '" data-index = "' + x + '">';
						selectorGroup += '<option value="-1">Choose a ' + optionType + '<\/option>';
						for (option in allOptions[optionType]) {
							state = (defaultSelectedOptions[optionType] !== undefined && defaultSelectedOptions[optionType] == option) ? 'selected':'';
							style = (availableOptions[optionType] === undefined || availableOptions[optionType][option] === undefined) ? 'class="disabled"':'';
							disable = (availableOptions[optionType] === undefined || availableOptions[optionType][option] === undefined) ? 'disabled="disabled"':'';
							selectorGroup += '<option value="' + option + '" ' + state + style + disable + '>' + allOptions[optionType][option].displayName + '<\/option>';
						}
						selectorGroup += '<\/select><\/fieldset>';
					} else {
						selectorGroup += '<fieldset><label class="label">' + optionType + '<\/label>';
						for (option in allOptions[optionType]) {
							selectorGroup += '<div class="read-only">' + allOptions[optionType][option].displayName + '<input type="hidden" class="attribute" value="' + option + '" data-attribute="' + optionType + '"/></div>';
						}
						selectorGroup += '<\/fieldset>';
					}
					
					
				}
				if (selectorGroup != '') {
					skuGroup.$info.prepend('<div class="item-selectors group">' + selectorGroup + '<\/div>');
					skuGroup.$selectors = $('.attribute', skuGroup.$container);
				}
				if (skuGroup.$personalizeInput.length > 0) {
					if (skuGroup.$personalizeInput.is(':checked')) {
						skuGroup.$container.find('.personalize-form').css('display', 'block');
					}
				}
				if (defaultSku !== '') {
					skuGroup.catalogRefId = defaultSku;
					this.updateAvailability(skuGroup, false);
					this.colorizeSkuGroupImage(skuGroup, prodId, defaultSelectedOptions, defaultSku);
				} else {
					skuGroup.catalogRefId = '';
					skuGroup.$qtyInput.attr('disabled', 'true');
				}
				skuGroup.enabled = true;
			} else {
				skuGroup.enabled = false;
				THIS.model.setDisabled(prodId);
				skuGroup.$container.hide();
			}
		}
		if(THIS.model.isAddToCartEnabled() == false){
			THIS.$addButton.hide();
		}
	},
	changeAttribute: function (index, $selectElement) {
		var THIS = this,
			skuGroup = this.skuGroups[index],
			prodId = skuGroup.prodId,
			optionType = '',
			optionId = '',
			triggerOptionType = $selectElement.attr('data-attribute'),
			triggerOptionId = $selectElement.val(),
			selectedOptions = {},
			filteredSkuArray,
			i;
		// Generate SelectedOptions
		if ($("option:selected", $selectElement).attr('disabled')) {
			// need to de-select some elements
			selectedOptions[triggerOptionType] = triggerOptionId;
			filteredSkuArray = THIS.model.getFilteredSkus(prodId, selectedOptions);
			skuGroup.$selectors.each(function () {
				optionType = $(this).attr('data-attribute');
				optionId = $(this).val();
				if (optionType != triggerOptionType) {
					for (i = 0; i < filteredSkuArray.length; i++) {
						if (filteredSkuArray[i].attributes[optionType].optionId == optionId) {
							selectedOptions[optionType] = optionId;
							break;
						}
					}
				} 
			});
		} else {
			skuGroup.$selectors.each(function () {
				optionType = $(this).attr('data-attribute');
				optionId = $(this).val();
				if (optionId != "-1") {
					selectedOptions[optionType] = optionId;
				}
			});
		}
		if (triggerOptionId == '-1'){
			this.updateSelectors({'skuGroup':skuGroup, 'prodId':prodId, 'selectedOptions':selectedOptions, 'triggerOptionType':triggerOptionType});
		} else {
			this.updateSelectors({'skuGroup':skuGroup, 'prodId':prodId, 'selectedOptions':selectedOptions, 'triggerOptionType':triggerOptionType, 'autoSelect':true, 'updateQty':true});
		}
		
	},
	selectSwatchAttributes : function (swatchOptions) {
		// loop though products and select these attributes.
		for (var x = 0; x < this.skuGroups.length; x++) {
			if (this.skuGroups[x].enabled !== false) {
				this.selectSkuGroupOptions(this.skuGroups[x],swatchOptions);
			} 
		}
	},
	selectSkuGroupOptions : function(skuGroup, options){
		var THIS = this,
			prodId = skuGroup.prodId,
			productOptionTypes = THIS.model.getOptionTypes(prodId),
			selectedOptions = {},
			match = false,
			filteredSkuArray,
			optionId,
			optionType,
			swatchOptionType,
			x, i, j, y, z,
			$selector;

		for (i = 0; i < productOptionTypes.length; i++) {
			if (options[productOptionTypes[i]] !== undefined) {
				match = true;
				break;
			}
		}
		if (match !== false) {
			filteredSkuArray = THIS.model.get(prodId).skus;
			for (swatchOptionType in options) {
				optionId = options[swatchOptionType];
				for (j = 0; j < filteredSkuArray.length; j++) {
					if (filteredSkuArray[j].attributes[swatchOptionType] != undefined && filteredSkuArray[j].attributes[swatchOptionType].optionId == optionId) {
						selectedOptions[swatchOptionType] = optionId;
						filteredSkuArray = THIS.model.getFilteredSkus(prodId, selectedOptions);
						break;
					}
				}
			}
			for (y = 0; y < skuGroup.$selectors.length; y++) {
				$selector = $(skuGroup.$selectors[y]);
				optionType = $selector.attr('data-attribute');
				if (options[optionType] === undefined) {
					optionId = $selector.val();
					for (z = 0; z < filteredSkuArray.length; z++) {
						if (filteredSkuArray[z].attributes[optionType].optionId == optionId) {
							selectedOptions[optionType] = optionId;
							filteredSkuArray = THIS.model.getFilteredSkus(prodId, selectedOptions);
							break;
						}
					}
				}
			}
			THIS.updateSelectors({'skuGroup':skuGroup, 'prodId':prodId, 'selectedOptions':selectedOptions, 'autoSelect':true});
		}
	},
	updateSelectors : function (options) {
		var THIS = this,
			skuGroup = options.skuGroup,
			prodId = options.prodId,
			selectedOptions = options.selectedOptions,
			updateQty = (options.updateQty != undefined)?options.updateQty:false,
			autoSelect = (options.autoSelect != undefined)?options.autoSelect:false,
			triggerOptionType = (options.triggerOptionType != undefined)?options.triggerOptionType:false,
			availableOptions = THIS.model.getFilteredOptions(prodId, selectedOptions),
			selectedValue = '',
			optionType = '',
			optionId = '',
			skuSelected = true,
			isDisabled = false,
			disabledValue,
			enabledItems;

		skuGroup.$selectors.each(function (i) {
			optionType = $(this).attr('data-attribute');
			selectedValue = $(this).val();
			enabledItems = 0;
			$('option', this).each(function () {
				
				optionId = $(this).attr('value');
				isDisabled = (optionId != '-1' && (availableOptions[optionType] === undefined || availableOptions[optionType][optionId] === undefined)) ? true:false;
				disabledValue = (isDisabled)?'disabled':'';
				if (isDisabled){
					
					$(this).css('color','#ccc').attr('disabled','disabled');
				}else {
					$(this).css('color','#000').removeAttr('disabled');
				}
				if(!isDisabled){
					enabledItems++;
				}
			});
			if(enabledItems == 2 && selectedOptions[optionType] == undefined && autoSelect == true){
				for (i in availableOptions[optionType]){
					selectedOptions[optionType] = availableOptions[optionType][i].optionId;
				}
				THIS.updateSelectors({'skuGroup':skuGroup, 'prodId':prodId, 'selectedOptions':selectedOptions, 'updateQty':updateQty});
				return;
			}
			if (selectedOptions[optionType] === undefined) {
				selectedValue = '-1';
				skuSelected = false;
			} else {
				selectedValue = selectedOptions[optionType];
			}
			$(this).val(selectedValue);
		});
		if (skuSelected !== false) {
			skuGroup.catalogRefId = THIS.model.getFilteredSkus(prodId, selectedOptions)[0].catalogRefId;
			this.updateAvailability(skuGroup, updateQty);
		} else {
			skuGroup.catalogRefId = '';
			this.resetAvailablility(skuGroup, updateQty);
		}
		this.colorizeSkuGroupImage(skuGroup, prodId, selectedOptions, skuSelected, triggerOptionType);
	},
	colorizeSkuGroupImage : function (skuGroup, prodId, selectedOptions, skuSelected, triggerOptionType){
		if (skuGroup.$image.length > 0){
			var colorizeType = this.model.getColorizeType(prodId),
				colorizeData = this.getColorData(skuGroup, selectedOptions, skuSelected, triggerOptionType),
				colorizedUrl = this.getColorizedUrl(skuGroup, colorizeType, colorizeData);
				if (colorizedUrl != ''){
					skuGroup.photoController.colorizeImage(colorizedUrl,colorizeData[0].id);
				}
			
		}
	},
	getColorData : function (skuGroup, selectedOptions, skuSelected, triggerOptionType) {
		var colors = [],
			prodId = skuGroup.prodId,
			primarySwatchOptions = this.model.getPrimarySwatchOptions(prodId),
			secondarySwatchOptions = this.model.getSecondarySwatchOptions(prodId),
			selectedSku,
			x,
			matchCount = 0;

		if (skuSelected === true){
			selectedSku = this.model.getSku(prodId, skuGroup.catalogRefId);
		}else{
			selectedSku = this.model.getFilteredSkus(prodId, selectedOptions)[0];
		}
		if(selectedSku.colorization !== undefined && selectedSku.colorization.length > 0){
			if (triggerOptionType){
				if (primarySwatchOptions !== false){
					matchCount = 0;
					for (x = 0; x < primarySwatchOptions.length; x++){
						for (option in selectedOptions){
							if (option == primarySwatchOptions[x]){
								matchCount++;
								break;
							}
						}
					}
					if (matchCount == primarySwatchOptions.length) {
						colors.push(selectedSku.colorization[0]);
					}
				}
				
				if (secondarySwatchOptions !== false){
					matchCount = 0;
					for (x = 0; x < secondarySwatchOptions.length; x++){
						for (option in selectedOptions){
							if (option == secondarySwatchOptions[x]){
								matchCount++;
								break;
							}
						}
					}
					if (matchCount == secondarySwatchOptions.length) {
						// colors.push(selectedSku.colorization[1]);
					}
				}
			} else {
				// for (x = 0; x < selectedSku.colorization.length; x++){
				// colors.push(selectedSku.colorization[x]);
				// }
				colors.push(selectedSku.colorization[0]);
			}
		}
		return colors;
	},
	getColorizedUrl : function(skuGroup, colorizeType, colorizeData){
		var colorizedUrl = '',
			baseUrl = skuGroup.origImage.substring(0,skuGroup.origImage.indexOf('.com/') + 5),
			recipe = skuGroup.origImage.substring(skuGroup.origImage.indexOf('$'), skuGroup.origImage.length),
			res;
		if(colorizeData.length == 1){
			if (colorizeType == 'static-color' && colorizeData[0].id != undefined){
				colorizedUrl = baseUrl + 'is/image/' + s7data.staticHost + '/' + skuGroup.imgBase + '_cl'+ colorizeData[0].id + '?' + recipe;
			} else if (colorizeType == 'dynamic-color' && colorizeData[0].color != undefined){
				colorizedUrl = baseUrl + 'is/image/' + s7data.staticHost + '?src=ir{'+ s7data.dynamicHost +'/' + skuGroup.imgBase +'?color='+ colorizeData[0].color + '}&' + recipe;
			} else if (colorizeType == 'dynamic-material' && colorizeData[0].color != undefined){
				res = (colorizeData[0].materialRes !== undefined)?colorizeData[0].materialRes:'';
				colorizedUrl = baseUrl + 'is/image/' + s7data.staticHost + '?src=ir{'+ s7data.dynamicHost +'/' + skuGroup.imgBase +'?src=' + s7data.dynamicHost + '/' + colorizeData[0].color + '&res=' + res +'}&' + recipe;
			}
		} else if (colorizeData.length == 2) {
			if (colorizeType == 'static-color' && colorizeData[0].id != undefined){
				colorizedUrl = baseUrl + 'is/image/' + s7data.staticHost + '/' + skuGroup.imgBase + '_cl'+ colorizeData[0].id + '_cl'+ colorizeData[1].id + '?' + recipe;
			}
		}
		
		return colorizedUrl;
	},
	resetProductForm : function () {
		for (var i = 0; i < this.skuGroups.length; i++) {
			this.skuGroups[i].$qtyInput.val('0');
		}
		this.$formContainer.empty();
	},
	updateAvailability : function (skuGroup, updateQty) {
		var THIS = this,
			catalogRefId = skuGroup.catalogRefId,
			availabilityMsg = THIS.model.getSkuAvailability(catalogRefId),
			itemDetailMessage = '',
			postalCodeMessage = '',
			deliveryMessage = '',
			inventoryMessage = '',
			finalSaleMessage = '',
			termsOfSaleMessage = '',
			price = '',
			postalForm = this.postalCodeInputs;
		if (availabilityMsg === false){
			THIS.model.setSkuAvailability(catalogRefId, THIS, skuGroup, updateQty);
			return;
		}
		if (availabilityMsg.inventoryCode == '-2'){
			this.showPurchasableError(skuGroup);
			return;
		}
		if (availabilityMsg === undefined || availabilityMsg.inventoryCode === undefined || availabilityMsg.listPrice === undefined || availabilityMsg.listPrice == '') {
			this.showInventoryError(skuGroup);
			return;
		}
		
		if ((availabilityMsg.postalCodeSpecific == 'true' || availabilityMsg.deliveryCode == '100' || availabilityMsg.deliveryCode == '101' || availabilityMsg.deliveryCode == '102') && availabilityMsg.deliveryPostalCode != undefined){
			postalForm = '<input type="text" id="postal-code" class="postal-code" size="6" maxlength="6" autocomplete="off" tabindex="0" value="'+availabilityMsg.deliveryPostalCode+'"/><input type="submit" value="Enter" class="submit postal-trigger"/>';
		}

		if (availabilityMsg.inventoryCode != '1001'){
			if (availabilityMsg.saleFlag == 'true'){
				if (availabilityMsg.clearanceFlag == 'true'){
					price = '<div class="label">Price</div><div class="price"><strike>' + availabilityMsg.listPrice + ' ea</strike> <strong class="sale">Final Sale ' + availabilityMsg.salePrice + ' ea</strong></div>';
				}else{
					price = '<div class="label">Price</div><div class="price"><strike>' + availabilityMsg.listPrice + ' ea</strike> <strong class="sale">Special ' + availabilityMsg.salePrice + ' ea</strong></div>';
				}
			} else {
				price = '<div class="label">Price</div><div class="price">' + availabilityMsg.listPrice + ' ea</div>';
			}
			if (availabilityMsg.shippingFlag == 'true') {
				if (availabilityMsg.shippingPrice !== undefined) {
					price += '<p class="surcharge">+ Shipping Surcharge ' + availabilityMsg.shippingPrice + ' ea</p>';
				}
			}
			if (availabilityMsg.clearanceFlag == 'true'){
				if (availabilityMsg.isCanadaShippable == 'false'){
				finalSaleMessage = '<div class="item-detail"><div class="label">Terms of Sale</div><p><span class="sale">This item is final sale and cannot be returned.</span><br/>This item cannot be shipped to Canada</p></div>';
				}else{
					finalSaleMessage = '<div class="item-detail"><div class="label">Terms of Sale</div><p class="sale">This item is final sale and cannot be returned.</p></div>';
				}
			}else{
				if (availabilityMsg.isCanadaShippable == 'false'){	
					termsOfSaleMessage = '<div class="item-detail"><div class="label">Terms of Sale</div><p>This item cannot be shipped to Canada</p></div>';
				}
			}
			skuGroup.$price.html(price);
		}
		
		if(availabilityMsg.inventoryCode != '1001'){
			skuGroup.$qtyInput.removeAttr('disabled');
		}
		if (availabilityMsg.postalCodeSpecific == 'true') {
			if (availabilityMsg.inventoryCode == '9999' || availabilityMsg.deliveryCode == '101'){
				// zip required
				if(availabilityMsg.deliveryCode == '200'){
					if (availabilityMsg.isFreightExempt == 'true') {
						deliveryMessage += '<p>Ships free of charge via ' + this.standardDeliveryLink + '<br/>';
					} else {
						deliveryMessage += '<p>' + this.standardDeliveryLink + '<br/>';
					}
					
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += availabilityMsg.deliveryMessage;
					}
					deliveryMessage += '</p>';
				} else {
					deliveryMessage += '<p>' + this.furnitureDeliveryLink + ' starting at ' + availabilityMsg.deliveryEstimate +'. Enter your Zip/Postal code for an estimate.';
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += '<br/>' + availabilityMsg.deliveryMessage;
					}
					deliveryMessage += '</p>';
				}
				inventoryMessage += '<fieldset><span class="error">Zip/Postal code is required to add this item to your cart.</span><br/>'
				inventoryMessage += postalForm + '</fieldset>';
				skuGroup.$qtyInput.removeAttr('disabled').val('0');
			} else if (availabilityMsg.deliveryCode == '102'){
				// bad zip code for delivery
				deliveryMessage += '<p>' + this.furnitureDeliveryLink + ' starting at ' + availabilityMsg.deliveryEstimate +'. Enter your Zip/Postal code for an estimate.';
				if (availabilityMsg.deliveryMessage != '') {
					deliveryMessage += '<br/>' + availabilityMsg.deliveryMessage;
				}
				deliveryMessage += '</p>';
				inventoryMessage += '<fieldset><span class="error">A valid US or Canadian Zip/Postal code is required to add this item to your cart. </span><br/>';
				inventoryMessage += postalForm + '</fieldset>';
				skuGroup.$qtyInput.val('0');
			} else if (availabilityMsg.inventoryCode == '1001') {
				// out of stock
				if (availabilityMsg.inventoryMessage != '') {
					inventoryMessage += '<p><span class="postalcode-update">' + availabilityMsg.inventoryMessage +' for Zip/Postal code ' + availabilityMsg.deliveryPostalCode  + ' (<a class="postalform-trigger-inventory submit-light">change location</a>). </span>';
					inventoryMessage += '<span class="postalcodeform-inline" style="display:none;">For Zip/Postal Code ' + postalForm + '</span>';
					inventoryMessage += '</p>';
				}
				skuGroup.$qtyInput.attr('disabled','disabled').val('0');
			} else {
				// zip required, read from cookie
				if (availabilityMsg.deliveryCode == '100'){
					deliveryMessage += '<p>' + this.furnitureDeliveryLink;
					deliveryMessage += '<span class="postalcode-update"> for ' + availabilityMsg.deliveryEstimate +'</span> to Zip/Postal code <span class="postalcode-update">' + availabilityMsg.deliveryPostalCode + ' (<a class="postalform-trigger-delivery submit-light">change location</a>). </span>';
					deliveryMessage += '<span class="postalcodeform-inline" style="display:none;">' + postalForm + '</span>';
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += '<br/>' + availabilityMsg.deliveryMessage;
					}
					deliveryMessage += '</p>';
				} else if (availabilityMsg.deliveryCode == '200'){
					if (availabilityMsg.isFreightExempt == 'true') {
						deliveryMessage += '<p>Ships free of charge via ' + this.standardDeliveryLink + '<br/>';
					} else {
						deliveryMessage += '<p>' + this.standardDeliveryLink + '<br/>';
					}
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += availabilityMsg.deliveryMessage;
					}
					deliveryMessage += '</p>';
				}
				if (availabilityMsg.inventoryMessage != '') {
					inventoryMessage += '<p><span class="postalcode-update">' + availabilityMsg.inventoryMessage +' for Zip/Postal code ' + availabilityMsg.deliveryPostalCode  + ' (<a class="postalform-trigger-inventory submit-light">change location</a>). </span>';
					inventoryMessage += '<span class="postalcodeform-inline" style="display:none;">For Zip/Postal Code ' + postalForm + '</span>';
					inventoryMessage += '</p>';
				}
				
				if(updateQty || quickView.getStatus()){
					skuGroup.$qtyInput.val('1');
				}
			}
		} else {
			if(availabilityMsg.inventoryCode != '1001'){
				if (availabilityMsg.deliveryCode == '101'){
					// zip required for quote
					deliveryMessage += '<p>' + this.furnitureDeliveryLink + ' starting at ' + availabilityMsg.deliveryEstimate +'. Enter your Zip/Postal code for an estimate.</p>';
					deliveryMessage += '<fieldset>' + postalForm + '</fieldset>';
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += '<p>' + availabilityMsg.deliveryMessage + '</p>';
					}
				} else if (availabilityMsg.deliveryCode == '102'){
					deliveryMessage += '<p>' + this.furnitureDeliveryLink + ' starting at ' + availabilityMsg.deliveryEstimate +'.</p>';
					deliveryMessage += '<fieldset><span class="error">Please enter a valid US or Canadian Zip/Postal code.</span><br/>';
					deliveryMessage += postalForm + '</fieldset>';
					
				} else if (availabilityMsg.deliveryCode == '100') {
					// zip required for quote, read from cookie
					deliveryMessage += '<p>' + this.furnitureDeliveryLink;
					deliveryMessage += '<span class="postalcode-update"> for ' + availabilityMsg.deliveryEstimate +'</span> to Zip/Postal code <span class="postalcode-update">' + availabilityMsg.deliveryPostalCode + ' (<a class="postalform-trigger-delivery submit-light">change location</a>). </span>';
					deliveryMessage += '<span class="postalcodeform-inline" style="display:none;">' + postalForm + '</span>';
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += '<br/>' + availabilityMsg.deliveryMessage;
					}
					deliveryMessage += '</p>';
				} else if (availabilityMsg.deliveryCode == '200'){
					if (availabilityMsg.isFreightExempt == 'true') {
						deliveryMessage += '<p>Ships free of charge via ' + this.standardDeliveryLink + '<br/>';
					} else {
						deliveryMessage += '<p>' + this.standardDeliveryLink + '<br/>';
					}
					if (availabilityMsg.deliveryMessage != '') {
						deliveryMessage += availabilityMsg.deliveryMessage;
					}
					deliveryMessage += '</p>';
				}
				if (availabilityMsg.inventoryMessage != '') {
					inventoryMessage +=  availabilityMsg.inventoryMessage + '.';
				}
				if(updateQty || quickView.getStatus()){
					skuGroup.$qtyInput.val('1');
				}
			} else {
				if (availabilityMsg.inventoryMessage != '') {
					inventoryMessage +=  availabilityMsg.inventoryMessage + '.';
				}
				skuGroup.$qtyInput.attr('disabled','disabled').val('0');
			}
		}

		itemDetailMessage += '<div class="item-detail">';
		if (deliveryMessage !=''){
			itemDetailMessage += '<div class="item-delivery-message"><div class="label">Delivery</div>' + deliveryMessage + '</div>';
		}
		if (inventoryMessage !=''){
			itemDetailMessage += '<div class="item-inventory-message"><div class="label">Availability</div>' + inventoryMessage + '</div>';
		}
		itemDetailMessage += '</div>'
		itemDetailMessage += finalSaleMessage;
		itemDetailMessage += termsOfSaleMessage;
		
		skuGroup.$sku.html('<span class="label">Item#</span>' + availabilityMsg.fullSkuId);
		skuGroup.$details.html(itemDetailMessage);

	},
	resetAvailablility : function (skuGroup) {
		skuGroup.$qtyInput.attr('disabled', 'true');
		skuGroup.$sku.html('');
		skuGroup.$price.html('<div class="label">Price</div>');
		skuGroup.$details.html('');
		$('input.postal-code', skuGroup.$container).val('');
		$('.postalcodeform-inline', skuGroup.$container).hide();
		skuGroup.$qtyInput.val('0');
	},
	requireZip : function () {
		var catalogRefId,
			availabilityMsg;
		for (var i = 0; i < this.skuGroups.length; i++) {
			catalogRefId = this.skuGroups[i].catalogRefId;
			availabilityMsg = this.model.getSkuAvailability(catalogRefId);
			if (this.skuGroups[i].enabled == true && (availabilityMsg !== false && availabilityMsg.inventoryCode == '9999')) {
				return true;
			}
		}
		return false;
	},
	noInventory : function () {
		var catalogRefId,
			availabilityMsg;
		for (var i = 0; i < this.skuGroups.length; i++) {
			catalogRefId = this.skuGroups[i].catalogRefId;
			availabilityMsg = this.model.getSkuAvailability(catalogRefId);
			if (this.skuGroups[i].enabled == true && (availabilityMsg !== false && availabilityMsg.inventoryCode == '1001')) {
				return true;
			}
		}
		return false;
	},
	getSelectedSkus : function (index){
		var skuArray = [],
			skuData = {},
			quantity = 0,
			prodId = '',
			catalogRefId = '',
			needsZip = this.requireZip(),
			hasNoInventory = this.noInventory(),
			x = 0,
			loopLength = this.skuGroups.length;
		if (index !== undefined){
			x = index;
			loopLength = (x+1 < this.skuGroups.length) ? x+1 : this.skuGroups.length;
		}
		for (x; x < loopLength; x++) {
			skuGroup = this.skuGroups[x];
			if (skuGroup.enabled === false) {
				continue;
			}
			quantity = skuGroup.$qtyInput.val();
			if (quantity > 0){
				prodId = skuGroup.prodId;
				catalogRefId = skuGroup.catalogRefId;
				if (!catalogRefId) {
					this.showError(errorMessages.missingDropdowns);
					return false;
				}
				var inventoryCode = this.model.getSkuAvailability(catalogRefId).inventoryCode;
				if (inventoryCode == '9999') {
					this.showError(errorMessages.zipRequired);
					return false;
				}
				skuData.prodId = prodId;
				skuData.catalogRefId = catalogRefId;
				skuData.quantity = quantity;
				// Monogram Fields
				if (skuGroup.$personalizeInput.length > 0) {
					if (skuGroup.$personalizeInput.is(':checked')) {
						monogramLayout = skuGroup.$container.find('select[name=prod' + x + '-fontAttributeId]');
						monogramColor = skuGroup.$container.find('select[name=prod' + x + '-threadColorAttrId]');
						monogramLine1 = skuGroup.$container.find('input[name=prod' + x + '-textLine1]');
						monogramLine2 = skuGroup.$container.find('input[name=prod' + x + '-textLine2]');
						monogramLine3 = skuGroup.$container.find('input[name=prod' + x + '-textLine3]');
						monogramLayoutValue = monogramLayout.val();
						monogramColorValue = monogramColor.val();
						monogramLine1Value = monogramLine1.val();
						monogramLine2Value = monogramLine2.val();
						monogramLine3Value = monogramLine3.val();
						if (monogramLayout.length > 0 && monogramLayoutValue == '') {
							this.showError(errorMessages.missingMonogramStyle);
							return false;
						}
						if (monogramColor.length > 0 && monogramColorValue == '') {
							this.showError(errorMessages.missingMonogramColor);
							return false;
						}
						if (monogramLine1Value == '') {
							this.showError(errorMessages.missingMonogramText);
							return false;
						}
						skuData.personalize = 'true';
						skuData.monogramLine1 = monogramLine1Value;
						if (monogramLayout.length > 0) {
							skuData.monogramLayout = monogramLayoutValue;
						}
						if (monogramColor.length > 0) {
							skuData.monogramColor = monogramColorValue;
						}
						if (monogramLine2.attr('disabled') != true) {
							skuData.monogramLine2 = monogramLine2Value;
						}
						if (monogramLine3.attr('disabled') != true) {
							skuData.monogramLine3 = monogramLine3Value;
						}
					}
				}
				if ($('#gift-from', skuGroup.$container).length > 0) {
					toValue = $('#gift-to', skuGroup.$container).val();
					fromValue = $('#gift-from', skuGroup.$container).val();
					if (fromValue == '' && toValue == '') {
						this.showError(errorMessages.missingToAndFrom);
						return false;
					} else if (fromValue == '') {
						this.showError(errorMessages.missingFrom);
						return false;
					} else if (toValue == '') {
						this.showError(errorMessages.missingTo);
						return false;
					}
					skuData.to = toValue;
					skuData.from = fromValue;
				}
				skuArray.push(skuData);
				skuData = {}; // reset
			}
		}
		
		if (skuArray.length == 0) {
			
			if (needsZip == true){
				this.showError(errorMessages.missingQuantityPostal);
			} else if (hasNoInventory == true) {
				this.showError(errorMessages.missingQuantityInventory);
			} else {
				this.showError(errorMessages.missingQuantity);
			}
			return false;
		} else {
			return skuArray;
		}
	},
	addToCartUpdate : function ($form, options) {
		var skuArray = options.skuArray,
			x = 0,
			form = $form[0];
		
		for (x=0; x < skuArray.length; x++) {
			skuData = skuArray[x];
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].catalogRefId'].value = skuData.catalogRefId;
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].productId'].value = skuData.prodId;
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].categoryId'].value = categoryId;
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].quantity'].value = skuData.quantity;
		// Monogram Fields
			if (skuData.personalize !== undefined) {
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].personalize'].value = skuData.personalize;
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[0]'].value = skuData.monogramLine1;
				if (skuData.monogramLayout !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramLayoutId']).removeAttr('disabled').val(skuData.monogramLayout);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramLayoutId']).attr('disabled', 'disabled');
				}
				if (skuData.monogramColor !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramColorId']).removeAttr('disabled').val(skuData.monogramColor);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramColorId']).attr('disabled', 'disabled');
				}
				if (skuData.monogramLine2 !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[1]']).removeAttr('disabled').val(skuData.monogramLine2);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[1]']).attr('disabled', 'disabled');
				}
				if (skuData.monogramLine3 !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[2]']).removeAttr('disabled').val(skuData.monogramLine3);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[2]']).attr('disabled', 'disabled');
				}
			} else {
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].personalize'].value = 'false';
			}
			
			if(skuData.to !== undefined){
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].value.toField'].value = skuData.to;
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].value.fromField'].value = skuData.from;
			} else {
				$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].value.toField']).attr('disabled', 'disabled');
				$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].value.fromField']).attr('disabled', 'disabled');
			}
		}
		return true;
	},
	addToGiftListUpdate : function ($form, options) {
		var skuArray = options.skuArray,
			x = 0,
			form = $form[0];
		
		for (x=0; x < skuArray.length; x++) {
			skuData = skuArray[x];
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].catalogRefId'].value = skuData.catalogRefId;
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].productId'].value = skuData.prodId;
			form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].quantity'].value = skuData.quantity;
		// Monogram Fields
			if (skuData.personalize !== undefined) {
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].personalize'].value = skuData.personalize;
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[0]'].value = skuData.monogramLine1;
				if (skuData.monogramLayout !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramLayoutId']).removeAttr('disabled').val(skuData.monogramLayout);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramLayoutId']).attr('disabled', 'disabled');
				}
				if (skuData.monogramColor !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramColorId']).removeAttr('disabled').val(skuData.monogramColor);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramColorId']).attr('disabled', 'disabled');
				}
				if (skuData.monogramLine2 !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[1]']).removeAttr('disabled').val(skuData.monogramLine2);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[1]']).attr('disabled', 'disabled');
				}
				if (skuData.monogramLine3 !== undefined) {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[2]']).removeAttr('disabled').val(skuData.monogramLine3);
				} else {
					$(form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].monogramTextLines[2]']).attr('disabled', 'disabled');
				}
			} else {
				form['/atg/commerce/order/purchase/CartModifierFormHandler.items[' + x + '].personalize'].value = 'false';
			}
		}
		return true;
	},
	handleResponse : function (responseText, statusText, xhr, $form) {
		var THIS = this.productGroup,
			jsonResponse = '',
			errorMessage = '';
		if (statusText == 'success') {
			// Check for json response
			try {
				jsonResponse = $.parseJSON(responseText);
			} catch (ex) {
				jsonResponse = false;
			}
			if (!jsonResponse) {
				if (responseText.indexOf('mod-order-items') > 0) {
					var originPage = String (document.location).split ('?')[0];
					if(originPage.indexOf("cart.jsp") > 0){
							document.location.reload(true);
						return;
					}
					
					// ACTION SUCCESS
					THIS.resetProductForm();
					THIS.$errorContainer.empty();
					if(quickView.getStatus() === true){
						removeOverlay();
						quickView.container.show({'content': responseText});
					} else {
						dialog.show({'content': responseText});
					}
				} else {
					// SESSION ERROR
					window.location.replace('/error/session.jsp');
				}
			} else {
				if (jsonResponse.type !== undefined && jsonResponse.type == 'postal' && jsonResponse.success == 'true') {
					// JSON SUCCESS MESSAGE
					THIS.model.resetSkuAvailability();
					
					for (x=0; x < THIS.skuGroups.length; x++) {
						if(THIS.skuGroups[x].catalogRefId != ''){
							THIS.updateAvailability(THIS.skuGroups[x], false);
							$('input.postal-code',THIS.skuGroups[x].$container).val('');
							$('.postalcodeform-inline',THIS.skuGroups[x].$container).hide();
						}
					}
					THIS.$errorContainer.empty();
					$('#postalSubmit', THIS.$formContainer).remove();
					miniCart.mcClear();
					
					if(quickView.getStatus() !== true){
						removeOverlay();
					} else {
						quickView.container.hideLoader();
					}
					
				} else {
					// JSON FAILURE MESSAGE
					if (jsonResponse.errors.length != 0) {
						for (var x = 0; x < jsonResponse.errors.length; x++) {
							errorMessage +=  jsonResponse.errors[x] ;
						}
					} else {
						errorMessage = THIS.communicationFailure;
					}
					if(quickView.getStatus() !== true){
						removeOverlay();
						THIS.showError(errorMessage);
					} else {
						quickView.container.hideLoader();
						THIS.showError(errorMessage);
					}
					
				}
			}
		} else { 
			// AJAX FAILED
			removeOverlay();
			THIS.showError();
		}
	},
	showError: function (msg) {
		var errorMessage = '<div class="mod mod-error-msg group group-notflush-top"><h3 class="brand">Error<\/h3><div class="error-msg-block"><div class="error-msg">';
		errorMessage += (msg) ? msg:this.communicationFailure;
		errorMessage += '<\/div><\/div><\/div>';
		this.$errorContainer.html(errorMessage);
		if (quickView.getStatus() !== true) {
			window.scrollTo(0, this.$errorContainer.offset().top - 10);
		}
	},
	showInventoryError : function (skuGroup) {
		var errorMessage = '<div class="item-detail error"><div class="label">Details</div>'+ ajaxError +'</div>';
		skuGroup.$qtyInput.attr('disabled', 'true');
		skuGroup.$sku.html('');
		skuGroup.$price.html('<div class="label">Price</div>');
		skuGroup.$details.html(errorMessage);
	},
	showPurchasableError : function (skuGroup) {
		var errorMessage = '<div class="item-detail error"><div class="label">Details</div>'+ errorMessages.purchasableError +'</div>';
		skuGroup.$qtyInput.attr('disabled', 'true');
		skuGroup.$sku.html('');
		skuGroup.$price.html('<div class="label">Price</div>');
		skuGroup.$details.html(errorMessage);
	},
	/* SWATCHES AND THUMBS */
	swatchOver : function ($trigger) {
		$('.swatch-details').remove();
		var swatchId = $trigger.attr('data-id'),
			swatchData = this.swatchModel.get(swatchId),
			THIS = this,
			colorize = (swatchData.colorize !== undefined) ? swatchData.colorize:'',
			details = (swatchData.details !== undefined) ? swatchData.details:'',
			requestable = (swatchData.requestable !== undefined) ? swatchData.requestable:'',
			primaryOptionId = (swatchData.primaryOptionId !== undefined) ? swatchData.primaryOptionId:'',
			swatchPage = '/catalog/product/includes/swatch-details.jsp?selected=' + swatchId + '&colorize=' + colorize + '&requestable=' + requestable + "&primaryOptionId=" + primaryOptionId,
			$swatchOverlay = $('<div class="swatch-details"></div>'),
			overlayWidth = 313;
			$triggerParent = $trigger.parent(),
			triggerPosition = $trigger.offset(),
			swatchGroupMidpoint = THIS.$swatchContainer.offset().left + overlayWidth,
			pageMidpoint = $('#main-body').offset().left + $('#main-body').width()/2,
			getImgParam = $trigger.attr('src'),
			alignLeft = false,
			expandLeft = false,
			thisWidth = $trigger.width(),
			thisHeight = $trigger.height();
		getImgParam = getImgParam.split('?$');
		getImgParam = getImgParam[1].split('$');
		
		if(THIS.$swatchContainer.offset().left > pageMidpoint){
			expandLeft = true;
		} else {
			expandLeft = false;
		}
		if (triggerPosition.left < swatchGroupMidpoint) {
			alignLeft = true;
		} else {
			alignLeft = false;
		}
		if (alignLeft) {
			if (expandLeft){
				$swatchOverlay.css({right: thisWidth - overlayWidth}).css({bottom: thisHeight + 9});
			} else {
				$swatchOverlay.css({left: 0}).css({bottom: thisHeight + 9});
			}
		} else {
			if (expandLeft){
				$swatchOverlay.css({right: 0}).css({bottom: thisHeight + 9});
			} else {
				$swatchOverlay.css({left: thisWidth - overlayWidth}).css({bottom: thisHeight + 9});
			}
		}
		$swatchOverlay.appendTo($triggerParent).fadeIn(300);
		$swatchOverlay.load(swatchPage);
		if (details == 'true') {
			$swatchOverlay.oneTime(1600, 'growBox', function () {
				$(this).animate({
					width: '585px'
				}, 600);
				
			});
		}
	},
	swatchOut : function ($trigger) {
		var $hoverBox = $trigger.parent().find('.swatch-details');
		$hoverBox.stopTime('growBox').fadeOut(300, function () {
			$hoverBox.remove();
		});
	},
	swatchSelect : function ($trigger) {
		var swatchId = $trigger.attr('data-id'),
			swatchData = this.swatchModel.get(swatchId),
			attributes = (swatchData.attributes !== undefined) ? swatchData.attributes:'',
			colorize = (swatchData.colorize !== undefined) ? swatchData.colorize:'',
			imgUrl = (swatchData.imgurl !== undefined) ? swatchData.imgurl:'';
		if (colorize == 'true') {
			$('#alt-photo0').attr('src', imgUrl);
			this.photoController.switchImage(0);
			activeElement = $trigger.closest('li');
			selectItemByTrigger(activeElement, '#product-swatches div.swatch-group li');
			this.photoController.updateZoomLink(swatchId);
			selectItemByIndex(-1, '#product-photo-thumbs li');
		}
		this.selectSwatchAttributes(attributes); 
	}
};


// DOM READY
$(document).ready(function(){
	// LINKS TO FAQ ITEMS ALWAYS EXPAND THAT ITEM
		$('a[href*="#faq"]').click(function() {
			var link = $(this).attr('href');
			var linkArr = link.split("#");
			var faqId = linkArr[1];
			openFaq("#" + faqId);
		});
	/* QUICKVIEW */
	$('.quick-view-trigger','#productgallery').live('mouseover',function(event){
		var productId = $(this).attr('data-productId'),
			type = $(this).attr('data-type'),
			skuId = $(this).attr('data-skuId'),
			swatchId = $(this).attr('data-swatchId');
		quickView.showLauncher({'productId':productId,'type':type,'skuId':skuId, 'swatchId':swatchId,'el':this});
	});
	
	/* PRODUCT ZOOM */
	$('.zoom-trigger').live('mouseover click',function(event){
		if(event.type == 'mouseover'){
			var elId = $('a.zoom-link', this).attr('id'),
				url = $('a.zoom-link', this).attr('href');
			if (!url) { return false; }
			productZoom.showLauncher({'elId':elId,'url':url, el:this});
			
		} else {
			var url = $('a.zoom-link',this).attr('href');
			productZoom.launch({'url':url});
			return false;
		}
	});

	/* MODALS */
	dialog = new ModalWindow();
	$('.modal-trigger').live('click',function(event){
		url = $(this).attr('href');
		if (!url) { return false; }
		if (!window['defaultModal']){
			defaultModal = new ModalWindow();
		}
		defaultModal.show({'url':url});
		return false;
	});

	/* MINI-CART */
	$('#util-cart').mouseover(function(){
		if ($(this).hasClass('disabled') == false){
			$('#util-cart').stopTime('hideTimer');
			miniCart.mcLoad();
		}
	}).mouseout(function() {
		if ($(this).hasClass('disabled') == false){
			$('#util-cart').oneTime(750, 'hideTimer', function() {
				miniCart.mcHide();
			});
		}
	});
	$('#mini-cart').mouseover(function() {
		$('#util-cart').stopTime('hideTimer');
	}).mouseout(function() {
		$('#util-cart').oneTime(750, 'hideTimer', function() {
			miniCart.mcHide();
		});
	});
	
	/* LEFT NAV */	
	var navPathName = location.pathname;
	if ( navPathName ) {
		$('#leftnav a[href="' + navPathName + '"]').attr('class', 'activated');
	}

	
	/* ENGAGEMENT COOKIE */
	// Set cookie to see how many pages have been visited in this session
	// Used to trigger promos on deeper engagement
	var engCookie = parseInt(($.cookie("engagement")));
	var viewCounter = 1;
	if (isNaN(engCookie)) {
		viewCounter = 1;
	} else {
		viewCounter = engCookie + 1;
	}
	$.cookie("engagement", viewCounter, {expires: 0, path: '/'});
	
	/* TOP NAV */
	// handle the hover of submenus
// $("li.level-1-inactive").hover(function(){
// $(this).find('ul').css("display", 'block').find('li').css("display",
// 'inline');
// $(this).find('a').addClass('hover');
// $("li.level-1-active").find('ul').css("display",
// "none").find('li').css("display", "none");
			// hide the shop by room navigator widget if it exists, this is
			// useful in the case where users get to sbr w/o a categoryId
			// if(!$('#headerContainer').hasClass('expanded')){
			// $('#slideContainer').hide();
			// $('#slideCommander').hide();
			// }
// },function() {
// $(this).find('a').removeClass('hover');
// $(this).find('ul').css("display", 'none').find('li').css("display", 'none');
// $("li.level-1-active").find('ul').css("display",
// "inline").find('li').css("display", "inline");
// var imgSrc = $(this).find('img').attr('src');
// if(imgSrc.indexOf('_on')){
// newImgOff = imgSrc.replace('_on','_off');
// $(this).find('img').attr('src',newImgOff);
// }
			// if(!$('#headerContainer').hasClass('expanded')){
			// $('#slideCommander').show();
			// $('#slideContainer').show();
			// }
// });
	
	/* ADD THIS */
	if(document.getElementById('shareButtons')){
		addthis.button("#shareButtons", {}, {url: sessionScrub()});
	}

	/* TOOL TIPS */
	$(':input.tipped').tooltip({
		// place tooltip on the right edge
		position: "center right",
		// a little tweaking of the position
		offset: [0, 5],
		// use the built-in fadeIn/fadeOut effect
		effect: "fade"
	});

	/* STRIPED TABLE CELLS AND DIVS */
	$('table.striped tbody tr:odd').addClass('even');
	$('div.striped:odd').addClass('even');

	/* SUCKERFISH FALLBACK FOR SIDEBAR FLYOUTS */
	$('#sidebar ul li').each(function(index) {
		$(this).hover(function() {
			$(this).addClass('sfhover');
		}, function() {
			$(this).removeClass('sfhover');
		});
	});
	
	/* FAQ ANSWER REVEAL */
	$('dl.faq dt span').click(function() {
		$(this).parent().next('dd').toggle();
	});
	/* FAQ ANSWER ANCHOR */
	if ($('dl.faq').length > 0){
		anchorId = location.hash;
		$(anchorId).parent().next('dd').toggle();
	}
	
	/* FOR TRADE/CONTRACT APPLICATION FORM */
	$('#applicationForm input.industry:checked').parent('fieldset').siblings('fieldset.radio').children('input').removeAttr('disabled');
	$('#applicationForm input.industry').change(function() {
		var thisSet = $(this).closest('fieldset.setContainer').attr('id');
		$(this).parent('fieldset').siblings('fieldset.radio').each(function() {
			$(this).find('input').removeAttr('disabled');
		});
		$('input.industry').not(':checked').parent('fieldset').siblings('fieldset.radio').each(function() {
			$(this).find('input').attr('disabled', true);
			$(this).find('input').attr('checked', false);
		});
	});
	$('#applicationForm .uploader input').change(function() {
		$(this).parent().removeClass('empty').addClass('loaded');
		$(this).siblings('.clearFile').removeClass('hidden');
		$('.uploader:not(.empty)').last().addClass('last-shown');
		$('.uploader:not(.empty):eq(4)').removeClass('last-shown');
	});
	
	/* CONTACT US */
	$('#contactUsForm .uploader input').change(function() {
		$(this).parent().removeClass('empty').addClass('loaded');
		$(this).siblings('.clearFile').removeClass('hidden');
		$('.uploader:not(.empty)').last().addClass('last-shown');
		$('.uploader:not(.empty):eq(4)').removeClass('last-shown');
	});

	/* DYNAMIC DISPLAY OF MULTIPLE UPLOAD FIELDS */
	$('.uploader').each(function() {// Hide empty upload fields
		if ( $(this).children('input').val() == "") {
			$(this).addClass('empty');
		}
	});
	// Show or remove marker for "add another"
	$('.uploader:not(.empty)').last().addClass('last-shown');
	$('.uploader:not(.empty):eq(4)').removeClass('last-shown');
	$('.clearFile').click(function() {
		$(this).addClass('hidden');
		$(this).parent('fieldset').find("input[type='file']").val('');
		if ( $('.uploader:not(.empty)').size() > 1) {
			$(this).parent()// hide fieldset if not the only one visible
				.addClass('empty')
				.removeClass('first')	
				.removeClass('last-shown')
				.removeClass('loaded');
				$('.uploader.loaded:not(.empty)').last().addClass('last-shown');
		} else {
			$(this).parent().removeClass('last-shown');
		}
		return false;
	});
	$('.addField').click(function() {
		var toShow = $(this).parent().siblings('.empty:first');
		$(toShow).removeClass('empty');
		$(this).parent('fieldset').removeClass('last-shown').after(toShow);
		return false;
	});
	
	/* CHECKOUT SHIP TO BLOCK */
	$('div.ship-address-block').click(function() {
		$(this).find('input').attr('checked', 'true');
	});
		
	/* PERSONALIZATION */
	$('.select-color').selectmenu({
		positionOptions: {offset: "0 -1"},
		maxHeight: 250,
		width: 220,
		icons: [{find: '.swatch-image'}],
		bgImage: function() {return 'url(' + $(this).attr("title") + ')';}
	});
	$('.select-layout').selectmenu({
		positionOptions: {offset: "0 -1"},
		maxHeight: 250,
		width: 220,
		icons: [{find: '.style-image'}],
		bgImage: function() {return 'url(' + $(this).attr("title") + ')';}
	});
	
	$('.item-personalize').click(function (e) {
		var $target = $(e.target);
		var $personalizationForm = $('.personalize-form',this);
		if ($target.hasClass('selected')) {
			$('.personalize-update', this).click();
		} else if ($target.hasClass('personalizeInput')) {
			$personalizationForm.toggle($target.is(':checked'));
		} else if ($target.hasClass('personalize-edit')) {
			$personalizationForm.show();
			$('.personalize-attributes',this).hide();
		} else if ($target.hasClass('personalize-cancel')) {
			$personalizationForm.hide();
			$('.personalize-attributes',this).show();
			return false;
		} else if ($target.hasClass('personalize-update')){
			// cart submission
			var personalize = $('.personalizeInput', this).is(':checked'),
				itemId = $(this).attr('data-item'),
				productId = $(this).attr('data-product'),
				monogramLine1 = '',
				monogramLayout = '',
				monogramColor = '',
				monogramLine2 = '';
				monogramLine3 = '';
			
			$('#monogram-itemId').val(itemId);
			$('#monogram-productId').val(productId);
			$('#monogram-personalize').val(personalize);
			
			if (personalize == false) {
				return true;
			}
			
			var monogramLayout = $('.select-layout', this),
				monogramColor = $('.select-color', this),
				monogramLine1 = $('.line1-text', this),
				monogramLine2 = $('.line2-text', this),
				monogramLine3 = $('.line3-text', this),
				monogramLayoutValue = monogramLayout.val(),
				monogramColorValue = monogramColor.val(),
				monogramLine1Value = monogramLine1.val(),
				monogramLine2Value = monogramLine2.val(),
				monogramLine3Value = monogramLine3.val(),
				errorContainer = "";

			if (monogramLayout.length > 0 && monogramLayoutValue == '') {
				if ($('.error-msg',this).length > 0){
					$('.error-msg',this).html(errorMessage);
				} else {
					errorContainer = '<div class="mod mod-error-msg group group-notflush-top"><h3 class="brand">Error<\/h3><div class="error-msg-block"><div class="error-msg">' + errorMessages.missingMonogramStyle + '<\/div><\/div><\/div>';
					$('.personalize-form',this).prepend(errorContainer);
				}
				return false;
			}
			if (monogramColor.length > 0 && monogramColorValue == '') {
				if ($('.error-msg',this).length > 0){
					$('.error-msg',this).html(errorMessage);
				} else {
					errorContainer = '<div class="mod mod-error-msg group group-notflush-top"><h3 class="brand">Error<\/h3><div class="error-msg-block"><div class="error-msg">' + errorMessages.missingMonogramColor + '<\/div><\/div><\/div>';
					$('.personalize-form',this).prepend(errorContainer);
				}
				return false;
			}
			if (monogramLine1Value == '') {
				if ($('.error-msg',this).length > 0){
					$('.error-msg',this).html(errorMessage);
				} else {
					errorContainer = '<div class="mod mod-error-msg group group-notflush-top"><h3 class="brand">Error<\/h3><div class="error-msg-block"><div class="error-msg">' + errorMessages.missingMonogramText + '<\/div><\/div><\/div>';
					$('.personalize-form',this).prepend(errorContainer);
				}
				return false;
			}


			$('#monogram-monogramTextLines0').val(monogramLine1Value);
			
			if (monogramLayout.length > 0) {
				$('#monogram-monogramLayoutId').removeAttr('disabled').val(monogramLayoutValue);
			} else {
				$('#monogram-monogramLayoutId').attr('disabled', 'disabled');
			}
			if (monogramColor.length > 0) {
				$('#monogram-monogramColorId').removeAttr('disabled').val(monogramColorValue);
			} else {
				$('#monogram-monogramColorId').attr('disabled', 'disabled');
			}
			if (monogramLine2.attr('disabled') != true) {
				$('#monogram-monogramTextLines1').removeAttr('disabled').val(monogramLine2Value);
			} else {
				$('#monogram-monogramTextLines1').attr('disabled', 'disabled');
			}
			if (monogramLine3.attr('disabled') != true) {
				$('#monogram-monogramTextLines2').removeAttr('disabled').val(monogramLine3Value);
			} else {
				$('#monogram-monogramTextLines2').attr('disabled', 'disabled');
			}
			return true;
		}
	}).change(function (e) {
		var $target = $(e.target);
		if($target.hasClass('select-layout')){
			selectScript(this, $target);
		}
	}).each(function(){
		var $target = $('.select-layout', this);
		selectScript(this, $target);
	});

	/* DOC WRITE FIX - for modal content that includes doc write */
	document.write = (function () {
		for (var i = 0; i < arguments.length; i++) {
			$('body').append(arguments[i]);
		}
	});
});


// type ahead search
function typeAhead(query, typeAheadMinimumLength) {
	$(document).keyup(function(e) {
		if ($(query).val().length >= typeAheadMinimumLength && e.keyCode != 13) {
			$.ajax({
				url: '/search/typeahead-results.jsp?terms=' + $(query).val(), 
				type:'GET', 
				dataType: 'html', 
				success:function(data) {
					$('#search-typeahead2').html(data);
					$('.search-input').addClass('dropped');
				},
				error:function(XMLHttpRequest, textStatus, errorThrown) {
					// no response
					// alert("Error: " + data);
				}
			});
		}
		else {
			$('#search-typeahead2').html("");
		}
	});
	
	
	$('body').click(function() {
		$('#search-typeahead2 ul').hide();
	});
	
	$(query).click(function(e) {
		e.stopPropagation();
		$('#search-typeahead2').show();
	});
	$(query).keyup(function(e){
			if (e.keyCode == 40) {
				if ($('.searchSelected').length==0) {
				$('#search-typeahead2 li:eq(0)').addClass('searchSelected');
				} else {
					var sele = $('.searchSelected');
					var whichone = ($('#search-typeahead2 li').index(sele)+1);
					$('#search-typeahead2 li:eq('+whichone+')').addClass('searchSelected');
					$(sele).removeClass('searchSelected');	
			}
			return false;
		} else if (e.keyCode == 38) {
				if ($('.searchSelected').length==0) {
				$('#search-typeahead2 li:last-child').addClass('searchSelected');
				} else {
					var sele = $('.searchSelected');
					var whichone = ($('#search-typeahead2 li').index(sele)-1);
					$('#search-typeahead2 li:eq('+whichone+')').addClass('searchSelected');
					$(sele).removeClass('searchSelected');	
			}
			return false;
		}
	});
	$(query).keydown(function(e){
	if ((e.keyCode == 13) && ($('.searchSelected').length > 0)) {
		window.location = $('.searchSelected a').attr('href');
		return false;
	};
});
};


// INJECT PLACEHOLDERS AS HACK AROUND ATG LACK OF SUPPORT
$('input.ph').each(function(index) {
	var phText = $(this).attr('title');
	$(this).attr('placeholder', phText);
});
