0

Hello
I need to build an interactive shopping page for a client.
Now, what I need is an ajax/javascript coding..

What I need is similar to http://www.switchflops.com/cart/home.php?ctype=ballet

When you click a shoe image thumbnail, an image of the shoe will appear, and then when on the accessory thumbnail, the shoe image will change into a shoe with the accessory..

I need to know which codes/scripts I need to use...
Basically, I dont know what kind of script or snippet was used.. Or what it is called...

Does someone have an idea...?
Please share..

Thanks!

1
Contributor
1
Reply
2
Views
7 Years
Discussion Span
Last Post by yenfa
0

this is the main code used for the js, I think...

var currShoe = 'none';
var prevShoe = 'none';
var currStrap = 'dflt';
var prevStrap = 'dflt';
var shoeCat = 'view all';
var strapCat = 'view all';
var loadedImgs = new Array();
var dfltDropBoxWidth = 42;
var handleHeight = 36;
var colPadding = 0;
var filterItems = {};
var postRegObj;
var needToAddStrap = false;
var cart = new Array();
var unableToAdd = false;

$(function() {
	if ($.browser.msie && $.browser.version == '6.0') {
		colPadding = 7;
	}

	$('div.colTopBox').each(function() {
		if ($(this).attr('_showing') == null) {
			$(this).attr('_showing', 'false');
		}
		$(this).attr('_height', $(this).height());
	});
	resizeColumns();

	$(window).resize(resizeColumns);

	if ($.browser.msie) {
		if ($.browser.version == '6.0') {
			$('#currentShoe1, #currentShoe2, #currentShoe3').wrap('<div></div>');
			$('#currentShoe1').attr('id', 'currShoeImg1').parent().attr('id', 'currentShoe1');
			$('#currentShoe2').attr('id', 'currShoeImg2').parent().attr('id', 'currentShoe2');
			$('#currentShoe3').attr('id', 'currShoeImg3').parent().attr('id', 'currentShoe3');
		}
		$('#currentShoe1, #currentShoe2, #currentShoe3').css({'background-color': '#ffffff', 'opacity': 0});
	}
	$('div.dropBox ul').hide();
	setTimeout(function() {$('div.dropBox ul').css('opacity', 1);}, 1000);
	$('div.dropBox').click(function(evt) {
		if ($(this).children('ul').css('display') == 'none') {
			hideDropBoxes(this.id);
			$(this).css('z-index', '2');
			var ul = $(this).children('ul');
			// if width is 0 then it is likely hidden inside another div, don't reset the width
			if (ul.width() < dfltDropBoxWidth && ul.width() != 0) {
				$(this).children('ul').width(dfltDropBoxWidth);
			}
			$(this).children('ul').slideDown(300);
		} else {
			hideDropBoxes(null, this.id);
		}
	}).mouseout(function(evt) {
		$(this).attr('_overCount', parseInt($(this).attr('_overCount')) - 1);
		clearTimeout($(this).attr('_hider'));
		if ($(this).attr('_overCount') <= 0) {
			$(this).attr({'_overCount': 0, '_hider': setTimeout('hideDropBoxes()', 1000)});
		}
	}).mouseover(function(evt) {
		$(this).attr('_overCount', parseInt($(this).attr('_overCount')) + 1);
		clearTimeout($(this).attr('_hider'));
		$(this).removeAttr('_hider');
	}).attr('_overCount', 0).each(function() {
		if ($.browser.msie) {
			$(this).trigger('click');
			hideDropBoxes();
		}
	});
	$('div.dropBox a').click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		var newVal = $(this).attr('_dropVal');
		if (newVal == null || newVal == '') {
			newVal = $(this).html();
		}
		var dropBox = $(this).parents('div.dropBox');
		dropBox.attr('_prevVal', dropBox.children('span.title').html());
		dropBox.children('span.title').html(newVal);
		hideDropBoxes(null, dropBox[0].id);
		// this little bit of code handles a callback of sorts to notify when
		// the value of the dropbox has changed
		if (dropBox.attr('_selFunc') != null) {
			eval('var func = ' + dropBox.attr('_selFunc'));
			func(dropBox);
		}
	})

	$('#shoeSquiggle, #strapSquiggle').each(function() {
		$(this).attr('_oldTop', $(this).position()['top']);
	})

	$('div.shopByCol').attr('_hilited', 'false').mouseover(function() {
		$(this).attr('_overCount', parseInt($(this).attr('_overCount')) + 1);
		clearTimeout($(this).attr('_hider'));
		$(this).removeAttr('_hider');
		if ($(this).children('div.shopByBody').height() == 0 && $(this).attr('_hilited') == 'false') {
			$(this).attr('_hilited', 'true').animate({'opacity': 1}, 300);
			if (this.id == 'shoeShopBy') {
				$('#shoeSquiggle').animate({'top': (parseInt($('#shoeSquiggle').attr('_oldTop')) + 12)}, 200);
			} else {
				$('#strapSquiggle').animate({'top': (parseInt($('#strapSquiggle').attr('_oldTop')) + 12)}, 200);
			}
		}
	}).mouseout(function() {
		$(this).attr('_overCount', parseInt($(this).attr('_overCount')) - 1);
		clearTimeout($(this).attr('_hider'));
		if ($(this).attr('_overCount') <= 0) {
			var timeout = 1500;
			if ($(this).children('div.shopByBody').height() == 0) {
				// should be a shorter timeout
				timeout = 250;
			}
			$(this).attr({'_overCount': 0, '_hider': setTimeout('hideShopBy("#' + this.id + '")', timeout)});
		}
	}).each(function() {$(this).attr('_overCount', 0);
	}).click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		if ($(this).children('div.shopByBody').height() == 0) {
			if ($.browser.msie && $.browser.version == '7.0') {
				$(this).animate({'height': $('#shoeCol').height() + 42}, 450);
			}
			$(this).children('div.shopByBody').animate({'opacity': 1, 'height': $('#shoeCol').height() + 2}, 500,
				function() {$(this).children('div.shopBottom').css('display', 'block');});
			$('#' + this.id + ' span.shopDrop').addClass('shopClose').removeClass('shopDrop');
			var squigId = '#shoeSquiggle';
			if (this.id == 'strapShopBy') {
				squigId = '#strapSquiggle';
			}
			$(squigId).animate({'top': $('#shoeCol').height() + 40}, 700);
		} else {
			hideShopBy('#' + this.id, true);
		}
	}).css('opacity', 0);
	$('#shopBySearch').click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
	});
	$('#shoeShopBody .fltrOpt').click(function(evt) {
		var fname = $(this).attr('_filter');
		$('#shoeFilterName span.shopByLabel, #shoeFilter span.shopByLabel').html(fname);
		$.getScript(location.protocol + '//' + location.hostname + $(this).attr('href') + '&js=true&fltr=shoe' + escape(fname), function() {
			// doing this timeout for good ol' frizari
			setTimeout('filterList("shoe", "shoe' + fname + '")', 50);
		});
	});
	$('#strapShopBody .fltrOpt').click(function(evt) {
		var fname = $(this).attr('_filter');
		$('#strapFilterName span.shopByLabel, #strapFilter span.shopByLabel').html(fname);
		$.getScript(location.protocol + '//' + location.hostname + $(this).attr('href') + '&js=true&fltr=strap' + escape(fname), function() {
			// doing this timeout for good ol' frizari
			setTimeout('filterList("strap", "strap' + fname + '")', 50);
		});
	});
	$('#strapShopBody').each(function() {
		// doing this inside as a sort of conditional check
		$('#shoesStraps .fltrOpt, #forKids .fltrOpt').click(function(evt) {
			var fname = $(this).attr('_filter');
			$('#strapFilterName span.shopByLabel, #strapFilter span.shopByLabel').html(fname);
			$.getScript(location.protocol + '//' + location.hostname + $(this).attr('href') + '&js=true&fltr=strap' + escape(fname), function() {
				// doing this timeout for good ol' frizari
				setTimeout('filterList("strap", "strap' + fname + '")', 50);
			});
		})
	});
	$('#saveToFavs').mouseover(function(evt) {
		$(this).attr('_overCount', parseInt($(this).attr('_overCount')) + 1);
		clearTimeout($(this).attr('_hider'));
		$(this).children('span').animate({'opacity': 1}, 300);
	}).mouseout(function(evt) {
		$(this).attr('_overCount', parseInt($(this).attr('_overCount')) - 1);
		clearTimeout($(this).attr('_hider'));
		if (parseInt($(this).attr('_overCount')) <= 0) {
			$(this).attr('_overCount', 0);
			$(this).attr('_hider', setTimeout(hideSave, 250));
		}
	}).attr({'_overCount': 0, '_dragging': 'false'}).css('opacity', 0);

	$('#shoeThumbFull, #shoeThumbHoriz').click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		if (currStrap == 'dflt') {
			toggleAltShoe();
		}
	}).css('opacity', 0);

	$('a.addItem').click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		var id = 0;
		var size = '';
		var qty = '';
		if (this.id == 'addShoe') {
			startWorking(this);
			id = shoes[currShoe]['pid'];
			size = $('#shoeSize span.title').text();
			size = (size == 'KL' ? 'Large' : (size == 'KM' ? 'Medium' : (size == 'KXL' ? 'X-Large' : (size == 'KS' ? 'Small' : size))));
			qty = $('#shoeQty span.title').text();
		} else if (this.id == 'addAccessory') {
			id = $(this).attr('_id');
			size = 'accessory';
			qty = $('#accessoryQty span.title').text();
			hideAccessoriesPopup();
		} else {
			startWorking(this);
			id = straps[currStrap]['pid'];
			size = $('#strapSize span.title').text();
			size = (size == 'L' ? 'Large' : (size == 'M' ? 'Medium' : (size == 'KL' ? 'Large' : (size == 'KM' ? 'Medium' : 'Small'))));
			qty = $('#strapQty span.title').text();
		}
		$.getScript(location.protocol + '//' + location.hostname + rootDir + 'cart/modules/Lulu_Custom/cart.php?mode=add&productid=' + id + '&psize=' + size + '&amount=' + qty, function() {
			setTimeout(updateCartGlance, 10);
			hideWorking();
		})
	});

	// setup position of the drag handle.  I know I could do this above, but it seems to cause a pause
	// in the display of the page, so I'm putting it here to get everything on the page first
	$('div.colTopBox').each(function() {
		if ($(this).attr('_showing') == 'true') {
			var colScroll = $(this).parent().children('div.colScroll');
			colScroll.css('top', colScroll.position()['top'] + $(this).height());
		}
	});

	$('input.dfltText').each(function() {
		$(this).attr('_dfltText', $(this).val());
	}).focus(function(evt) {
		if ($(this).val() == $(this).attr('_dfltText')) {
			$(this).val('');
		}
	}).blur(function(evt) {
		if ($.trim($(this).val()) == '') {
			$(this).val($(this).attr('_dfltText'));
		}
	});

	$('.myFavLink').click(function(evt) {
		if (!$(this).hasClass('myFavoritesTitle')) {
			evt.preventDefault();
			evt.stopPropagation();
		}
		favLinkClicked(this);
	});
	$('a.regPopClose').click(function(evt) {
		hidePopup(evt);
		hideWorking();
	})
	$('#popSignIn').click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		startWorking(this);
		loginUser($('#popUname'), $('#popPasswd'));
	});
	$('#regPopBtn').click(function(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		startWorking(this);
		registerUser('pop');
	});
	setTimeout(function() {setupColumnList('shoe');}, 500);
	setTimeout(function() {setupColumnList('strap');}, 500);
	checkChangedHash();
	$('a.popup').click(popitup);

	$('#shoeDrag').attr('_timer', setTimeout(function() {animDrag($('#shoeDrag'));}, 3000));
	$('#strapDrag').attr('_timer', setTimeout(function() {animDrag($('#strapDrag'));}, 3000));

	// x-cart does this thing where it converts extended chars to their html entities but we need
	// the literal character
	if (typeof(currency) != 'undefined' && currency == '&#8356;') currency = '₤';

	$('#viewNewAll').click(function() {
		$('a.newArrivalsTitle').trigger('click');
		return false;
	});

});

function resizeColumns() {
	var diffHeight = calcDiffHeight();
	$('div.col').height(484 + diffHeight).each(function() {
		var topBox = $(this).children('div.colTopBox');
		var infoDiff = topBox.attr('_showing') == 'true' ? parseInt(topBox.attr('_height')) : 0;
		$(this).children('div.colContainer').height(484 + diffHeight + colPadding - infoDiff);
		$(this).children('div.colScroll').height(476 + diffHeight - colPadding - infoDiff);
	});
	recalcScrolls();
}
// default calculation for getting the difference height to the minimum of the column height
// other js files may override this to get a different value
function calcDiffHeight() {
	var winHeight = $(window).height();
	if (winHeight < 630) {
		winHeight = 630;
	}
	return winHeight - 630;
}
// pass in a specific column (jquery wrapped) if only a specific scrollbar should be recalculated
function recalcScrolls(column) {
	if (column == null) {
		column = $('div.col');
	}
	column.each(function() {
		var container = $(this).children('div.colContainer');
		var colList = container.children('div.colList');
		var maxShoe = -(colList.height() - container.height());
		var colScroll = $(this).children('div.colScroll');
		if (maxShoe > 0) {
			// the list is shorter than the container
			colScroll.children('div.colHandle').css('top', 0);
			// just a dummy check, make sure the list is scrolled to the top
			colList.css('top', 0);
		} else if (colList.position()['top'] < maxShoe) {
			colList.css('top', maxShoe);
			colScroll.children('div.colHandle').css('top', (colScroll.height() - handleHeight));
		} else {
			colScroll.children('div.colHandle').css('top', (colScroll.height() - handleHeight) * (colList.position()['top'] / maxShoe));
		}
	});
}
function flick(id) {
	if (id == null) {
		id = 'div.col';
	}
	$(id).each(function() {
		var container = $(this).children('div.colContainer');
		var colList = container.children('div.colList');
		var colHandle = $(this).children('div.colScroll').children('div.colHandle');
		colList.draggable({'axis': 'y', 'distance': 5,
			'start': function(e, ui) {
				$(this).attr('maxHeight', -($(this).height() - $(this).parent().height() + 55));
				$(this).attr('prevY', 0);
				$(this).attr('distance', $(this).position()['top']);
				var colScroll = $(this).parents('div.col').children('div.colScroll');
				$(this).attr('scrollMax', colScroll.height() - handleHeight);
				if (this.id.substring(0, 4) == 'shoe') {
					clearTimeout($('#shoeDrag').attr('_timer'));
					$('#shoeDrag').stop().remove();
				} else if (this.id.substring(0, 5) == 'strap') {
					clearTimeout($('#strapDrag').attr('_timer'));
					$('#strapDrag').stop().remove();
				}
			},
			'drag': function(e, ui) {
				var jThis = $(this);
				var thisTop = $(this).position()['top'];
				jThis.attr('flick', 'true');
				var jHandle = jThis.parents('div.col').children('div.colScroll').children('div.colHandle');
				var scrollHeight = jThis.attr('scrollMax');
				var handleTop = (thisTop / jThis.attr('maxHeight')) * scrollHeight;
				if (handleTop > scrollHeight) {
					handleTop = scrollHeight;
				} else if (handleTop < 0) {
					handleTop = 0;
				}
				jHandle.css('top', handleTop);
			},
			'stop': function(e, ui) {
				var currTop = $(this).position()['top'];
				var maxHeight = parseInt($(this).attr('maxHeight'));
				if (currTop > 0 || currTop < maxHeight) {
					// need to bump back to within its limits
					var moveTo = maxHeight;
					if (currTop > 0) {
						moveTo = 0;
					}
					$(this).animate({'top': moveTo}, 500, 'easeOutExpo', function() {
						$(this).attr('flick', 'false');
					});
				} else {
					var id = this.id;
					setTimeout(function() {
						$('#' + id).attr('flick', 'false');
					}, 10);
				}
		}}).attr('flick', 'false');
		colHandle.draggable({'axis': 'y', 'containment': 'parent',
			'start': function(e, ui) {
				var container = $(this).parents('div.col').children('div.colContainer');
				var colList = container.children('div.colList');
				// 55 is in there to help the scroll function properly so it shows the entire
				// shoe at the bottom of the scrolling
				colList.attr('maxHeight', -(colList.height() - (container.height() - 55)));
				$(this).attr('_dragging', 'true');
				if (this.id.substring(0, 4) == 'shoe') {
					clearTimeout($('#shoeDrag').attr('_timer'));
					$('#shoeDrag').stop().remove();
				} else if (this.id.substring(0, 5) == 'strap') {
					clearTimeout($('#strapDrag').attr('_timer'));
					$('#strapDrag').stop().remove();
				}
			},
			'drag': function(e, ui) {
				var colScroll = $(this).parent();
				var colList = colScroll.parent().children('div.colContainer').children('div.colList');
				colScroll.attr('dragged', 'true');
				var handleTop = $(this).position()['top'];
				var posPct = handleTop / (colScroll.height() - handleHeight);
				posPct = (posPct > 1 ? 1 : (posPct < 0 ? 0 : posPct));
				colList.css('top', colList.attr('maxHeight') * posPct);
			},
			'stop': function(e, ui) {
				if (parseInt($(this).attr('_overCount')) == 0) {
					clearTimeout($(this).attr('_hider'));
					$(this).attr('_dragging', 'false');
				} else {
					clearTimeout($(this).attr('_hider'));
					$(this).attr('_dragging', 'false');
				}
			}
		});

	});
}

function animDrag(id) {
	// yeah, yeah I know I can do this recursively
	$(id).animate({'top': 74}, 1000, 'easeOutQuad', function() {
		$(id).animate({'top': 184}, 200, 'easeOutQuad', function() {
			$(id).animate({'top': 74}, 600, 'easeOutQuad', function() {
				$(id).animate({'top': 184}, 300, function() {
					$(id).attr('_timer', setTimeout(function() {
						animDrag(id);
					}, 3000));
				});
			})
		});
	});
}
function updateShoe() {
	if (currShoe != prevShoe && currShoe != 'none') {
		// do info box stuff and hiliter
		$('#shoeTitle').html($('#' + currShoe).text());
		var jsShoe = shoes[currShoe];
		$('#shoeDesc').html(jsShoe['desc']);
		$('#shoePrice').html(currency + jsShoe['price']);
		prevShoe = currShoe;
		$('#shoeHiliter').each(function() { 
			$(this).css('opacity', 0).children('span').css('opacity', 0);
		}).css('top', parseInt($('#' + currShoe).position()['top']) + 25)
		.animate({'opacity': 1}, 300, function() {
			$(this).children('span').animate({'opacity': 1}, 300, function() {
				$(this).animate({'opacity': 0}, 300);
			});
			$('#shoeTitleHilite').animate({'opacity': 1}, 300, function() {
				$(this).animate({'opacity': 0}, 300);
			})
		});
		ensureVisible('shoe');
	}
	if (currStrap != prevStrap && currStrap != 'dflt') {
		// do info box stuff and hiliter
		$('#strapTitle').html($('#' + currStrap).text());
		var jsStrap = straps[currStrap];
		$('#strapDesc').html(jsStrap['desc']);
		$('#strapPrice').html(currency + jsStrap['price']);
		prevStrap = currStrap;
		$('#strapHiliter').each(function() {
			$(this).css('opacity', 0).children('span').css('opacity', 0);
		}).css('top', parseInt($('#' + currStrap).position()['top']) + 35)
		.animate({'opacity': 1}, 300, function() {
			$(this).children('span').animate({'opacity': 1}, 300, function() {
				$(this).animate({'opacity': 0}, 300);
			});
			$('#strapTitleHilite').animate({'opacity': 1}, 300, function() {
				$(this).animate({'opacity': 0}, 300);
			})
		});
		ensureVisible('strap');
	} else if (currStrap == 'dflt' && currStrap != prevStrap) {
		prevStrap = currStrap;
	}
	if (currShoe == 'none') {
		// no shoe selected, just return
		return;
	}
	if ($('#instructions').css('display') != 'none') {
		$('#instructions').animate({'opacity': 0}, 500, function() {
			$(this).css('display', 'none');
		});
		$('#viewNewAll').hide();
		$('#loading').animate({'opacity': 1}, 500);
	}
	var newShoe = '#currentShoe2';
	var oldShoe = '#currentShoe1';
	if ($('#currentShoe1').attr('_showing') == 'false') {
		newShoe = '#currentShoe1';
		oldShoe = '#currentShoe2';
	}
	
	var shoeName = currStrap + '_' + currShoe;
	var imgPath = location.protocol + '//switchflops.chocolatepocketl.netdna-cdn.com/images/full/' + shoeName + '.png';
	loadAndDisplayImage(shoeName, imgPath, function() {
		displayShoe(newShoe, imgPath);
	});
	if (currStrap == 'dflt') {
		setupAltShoeViewer();
	} else {
		hideAltShoeViewer();
	}

	$(oldShoe + ', #currentShoe3').attr('_showing', 'false').css('z-index', 0).animate({'opacity': 0}, 500);
}
function loadAndDisplayImage(id, imgPath, dispFunc) {
	if ($.inArray(id, loadedImgs) == -1) {
		loadedImgs.push(id);
		var img = new Image();
		$(img).load(function() {
			dispFunc();
		}).attr('src', imgPath);
	} else {
		dispFunc();
	}

}
function displayShoe(shoeImg, path) {
	if ($.browser.msie && $.browser.version == '6.0') {
		// IE 6 of course doesn't work with PNG alpha channels except through background image filters
		// so this has to be done
		$(shoeImg).css({'z-index': 1, 'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + path + '",sizingMethod="crop")',
			'opacity': 0}).attr('_showing', 'true').animate({'opacity': 1}, 500);
	} else {
		$(shoeImg).attr({'_showing': 'true', 'src': path}).animate({'opacity': 1}, 500).css('z-index', 1);
	}
	if ($('#saveToFavs').css('opacity') == '0') {
		$('#saveToFavs').animate({'opacity': 1}, 500);
		$('#instructions').animate({'opacity': 0}, 500);
		$('#viewNewAll').hide();
	}
}
function showTopBox(id, callBack) {
	var colTopBox = $(id).children('div.colTopBox');
	if (colTopBox.attr('_showing') == 'false') {
		colTopBox.attr('_showing', 'true');
		var boxHeight = parseInt(colTopBox.attr('_height'));
		colTopBox.slideDown(500);
		var container = $(id).children('div.colContainer');
		var colScroll = $(id).children('div.colScroll');
		container.animate({'height': container.height() + colPadding - boxHeight}, 500, function() {
			callBack();
			recalcScrolls($(id));
		});
		$(id).children('div.colDrag').remove();
		colScroll.css('top', colScroll.position()['top'] + boxHeight).height(colScroll.height() - boxHeight);
	}
}
function hideTopBox(id, callBack) {
	var colTopBox = $(id).children('div.colTopBox');
	if (colTopBox.attr('_showing') == 'true') {
		colTopBox.attr('_showing', 'false');
		var boxHeight = parseInt(colTopBox.attr('_height'));
		colTopBox.slideUp(500);
		var container = $(id).children('div.colContainer');
		var colScroll = $(id).children('div.colScroll');
		var newContHeight = container.height() + boxHeight - colPadding;
		container.animate({'height': newContHeight}, 500, callBack);
		colScroll.css('top', colScroll.position()['top'] - boxHeight).height(colScroll.height() + boxHeight);
		// check that the list doesn't get squished up too high when closing, else bring down
		var colList = container.children('div.colList');
		if (-colList.position()['top'] + newContHeight + 25 > colList.height()) { // 25 is the padding that doesn't show up in the height
			var newListTop = newContHeight - 50 - colList.height();
			colList.animate({'top': newListTop}, 500, function() {
				recalcScrolls($(id));
			});
		}
	}
}
function hideDropBoxes(exceptFor, forceClose) {
	$('div.dropBox').each(function() {
		if (this.id == forceClose || (this.id != exceptFor && parseInt($(this).attr('_overCount')) <= 0)) {
			var id = this.id;
			$(this).css('z-index', '1').children('ul').slideUp(300, function() {$('#' + id).css('z-index', '0');});
		}
	})
}
function hideShopBy(id, forceClose) {
	if (parseInt($(id).attr('_overCount')) <= 0 || forceClose) {
		var squigId = '#shoeSquiggle';
		if (id == '#strapShopBy') {
			squigId = '#strapSquiggle';
		}
		if ($(id).children('div.shopByBody').height() == 0) {
			$(id).attr('_hilited', 'false').animate({'opacity': 0}, 300);
			$(squigId).animate({'top': $(squigId).attr('_oldTop')}, 200);
		} else {
			if ($.browser.msie && $.browser.version == '7.0') {
				$(id).animate({'height': 0}, 500);
			}
			$(id).children('div.shopByBody').animate({'opacity': 0, 'height': 0}, 500, 'easeInQuint')
				.children('div.shopBottom').css('display', 'none');
			$(id + ' span.shopClose').addClass('shopDrop').removeClass('shopClose');
			if (forceClose != null) {
				$(squigId).animate({'top': parseInt($(squigId).attr('_oldTop')) + 12}, 800, function() {
					if (parseInt($(id).attr('_overCount')) == 0) {
						$(id).attr('_hilited', 'false').animate({'opacity': 0}, 500);
						$(squigId).animate({'top': $(squigId).attr('_oldTop')}, 200);
					}
				});
			} else {
				$(squigId).animate({'top': $(squigId).attr('_oldTop')}, 500, function() {
					if (parseInt($(id).attr('_overCount')) == 0) {
						$(id).attr('_hilited', 'false').animate({'opacity': 0}, 500);
					}
				});
			}
		}
	}
}
function hideSave() {
	if (parseInt($('#saveToFavs').attr('_overCount')) == 0) {
		$('#saveToFavs span').animate({'opacity': 0}, 300);
	}
}
// just make sure that the clicked on item is visible in its respective column
function ensureVisible(type) {
	var item = $('#' + (type == 'shoe' ? currShoe : currStrap));
	var container = $('#' + type + 'Container');
	scrollToItem(item, container);
}
// function to scroll a list to where a particular item is in it, just pass the
// jquery wrapped item and the column container it is within.
function scrollToItem(item, container) {
	var list = $(container).children('div.colList');
	var listTop = list.position()['top'];
	var itemTop = item.position()['top'];
	if (itemTop + listTop - 20 < 0) {
		list.animate({'top': listTop - (itemTop + listTop - 20)}, 300); // 20 is to give it a slight padding above the item
	} else if (itemTop + listTop + item.height() + 20 > container.height()) {
		list.animate({'top': listTop - (itemTop + listTop + item.height() - container.height() + 20)}, 300); // 20 is t give it a slight padding below the item
	}
}
function setupAltShoeViewer() {
	var setupFunc = function() {
		var imgId = currStrap + '_' + currShoe;
		$('#shoeThumbFull').attr('src', 'http://switchflops.chocolatepocketl.netdna-cdn.com/images/thumbs/' + imgId + '.png');
		var imgPath = 'http://switchflops.chocolatepocketl.netdna-cdn.com/images/thumbs/' + imgId + '34.png';
		loadAndDisplayImage(imgId + '_thumb34', imgPath, function() {
			$('#shoeThumbHoriz').attr('src', imgPath).animate({'opacity': 1}, 500).attr('_showing', 'true');
		});
	};
	// make sure the old alt view is hidden if visible
	if (hideAltShoeViewer()) {
		setTimeout(setupFunc, 500);
	} else {
		setupFunc();
	}
}
function hideAltShoeViewer() {
	var hiding = false;
	if ($('#shoeThumbFull').attr('_showing') == 'true') {
		hiding = true;
		$('#shoeThumbFull').animate({'opacity': 0}, 500).attr('_showing', 'false');
	} else {
		$('#shoeThumbFull').css('opacity', 0).attr('_showing', 'false');
	}
	if ($('#shoeThumbHoriz').attr('_showing') == 'true') {
		hiding = true;
		$('#shoeThumbHoriz').animate({'opacity': 0}, 500).attr('_showing', 'false');
	} else {
		$('#shoeThumbHoriz').css('opacity', 0).attr('_showing', 'false');
	}
	return hiding;
}
function toggleAltShoe() {
	var showThumb = '#shoeThumbHoriz';
	var hideThumb = '#shoeThumbFull';
	var newShoe = '#currentShoe3';
	var shoeName = currStrap + '_' + currShoe;
	var imgPath = 'http://switchflops.chocolatepocketl.netdna-cdn.com/images/full/' + currStrap + '_' + currShoe;
	if ($('#shoeThumbFull').attr('_showing') == 'false') {
		// show the horizontal image
		shoeName += '34';
		imgPath += '34.png';
		$('#currentShoe1, #currentShoe2').css('z-index', 0).animate({'opacity': 0}, 500);
	} else {
		imgPath += '.png';
		$('#currentShoe3').css('z-index', 0).animate({'opacity': 0}, 500);
		showThumb = '#shoeThumbFull';
		hideThumb = '#shoeThumbHoriz';
		newShoe = '#currentShoe1';
	}
	loadAndDisplayImage(shoeName, imgPath, function() {
		displayShoe(newShoe, imgPath);
	})
	$(showThumb).animate({'opacity': 0}, 500).attr('_showing', 'false');
	$(hideThumb).animate({'opacity': 1}, 500).attr('_showing', 'true');
}
function setupColumnList(listName) {
	// setup the items in the shoe list
	$('#' + listName + 'List a.shoeThumb').click(function(evt) {
		if ($(this).parent()[0].id == 'shoeList' && $('#shoeList').attr('flick') == 'false') {
			currShoe = this.id;
			currStrap = 'dflt';
			updateHash();
			showTopBox('#shoeCol', function() {
				ensureVisible('shoe');
			});
			updateShoe();
			hideTopBox('#strapCol', function() {
				$('#strapHiliter').css('top', -27);
			});
			logView('prod');

			// need to check on half sizes for snap shoes
			if (this.id.match('^jordi')) {
				$('#shoeSizeDrop li.halfSize').hide();
			} else {
				$('#shoeSizeDrop li.halfSize').show();
			}

		}
		evt.preventDefault();
		evt.stopPropagation();
	});
	// setup the items in the strap list
	$('#' + listName + 'List a.strapThumb').click(function(evt) {
		if ($(this).parent()[0].id == 'strapList' && $('#strapList').attr('flick') == 'false') {
			currStrap = this.id;
			updateHash();
			showTopBox('#strapCol', function() {
				ensureVisible('strap');
			});
			updateShoe();
			logView('prod');
		}
		evt.preventDefault();
		evt.stopPropagation();
	})
	flick('#' + listName + 'Col');
}
function logView(type) {
	var urlArgs = '?type=' + type;
	var url = location.protocol + '//' + location.hostname + rootDir + 'cart/modules/Lulu_Custom/stats.php';

	if (type == 'prod') {
		if (currShoe != 'none') {
			urlArgs += '&shoeid=' + shoes[currShoe]['pid'];
		} else {
			urlArgs += '&shoeid=0';
		}
		if (currStrap != 'dflt') {
			urlArgs += '&strapid=' + straps[currStrap]['pid'];
		} else {
			urlArgs += '&strapid=0';
		}
	}
	// just give the main focus, displaying shoes, some breathing room first, and spin this
	// off for 1/10 of a second
	setTimeout(function() {
		// log to x-cart's stats
//		$('#statsImg').attr('src', url + urlArgs);
//		$.ajax({'url': url + urlArgs, 'dataType': 'text'});
		// log to google analytics
		urchinTracker(rootDir + 'cart/home.php' + urlArgs);
	}, 100);
}
function filterList(id, filter) {
	if (id == 'strap') {
		if (filter == strapCat) {
			return;
		} else {
			strapCat = filter;
		}
	} else {
		if (filter == shoeCat) {
			return;
		} else {
			shoeCat = filter;
		}
	}
	var items = shoes;
	var currItem = currShoe;
	if (filter == id + 'view all') {
		updateHash();
		// just loop through the list and show all
		$('#' + id + 'List a.' + id  + 'Thumb').each(function() {
			$(this).slideDown(350);
		});
		$('#' + id + 'List').animate({'top': 0}, 400);
		setTimeout('moveHiliter("' + id + '")', 360);
		return;
	} else if (id == 'strap') {
		items = straps;
		currItem = currStrap;
	}
	var fltrList = filterItems[filter];
	for (var x in items) {
		var found = false;
		for (var y in fltrList) {
			if (fltrList[y] == items[x]['pid']) {
				found = true;
				fltrList.splice(y, 1);
				break;
			}
		}
		if (found) {
			$('#' + items[x]['id']).slideDown(350);
		} else {
			$('#' + items[x]['id']).slideUp(350);
			if (items[x]['id'] == currItem) {
				// need to hide the selection
				if (id == 'shoe') {
					currShoe = 'none';
					currStrap = 'dflt';
					hideTopBox('#shoeCol', function() {
						$('#shoeHiliter').css('top', -27);
					});
					resetMiddle();
				} else {
					currStrap = 'dflt';
				}
				updateShoe();
				hideTopBox('#strapCol', function() {
					$('#strapHiliter').css('top', -27);
				});
				$('#' + id + 'List').animate({'top': 0}, 400);
			}
		}
	}
	updateHash();
	setTimeout('recalcScrolls($("#' + id + 'Col"))', 360);
	setTimeout('moveHiliter("' + id + '")', 360);
}
function moveHiliter(id) {
	if (id == 'shoe' && currShoe != 'none') {
		// need to reset the hiliter to the correct position
		$('#shoeHiliter').css('top', parseInt($('#' + currShoe).position()['top']) + 25)
		ensureVisible(id);
	} else if (currStrap != 'dflt') {
		// need to reset the hiliter to the correct position
		$('#strapHiliter').css('top', parseInt($('#' + currStrap).position()['top']) + 25)
		ensureVisible(id);
	}
}
function updateCartGlance() {
	if (unableToAdd) {
		unableToAdd = false;
		return;
	}
	if (cart['item_count'] == 0) {
		$('#bagCount').html('no items');
	} else if (cart['item_count'] == 1) {
		$('#bagCount').html('1 style');
	} else {
		$('#bagCount').html(cart['item_count'] + ' styles');
	}
	$('#bagCount').animate({'backgroundColor': '#76644a', 'color': '#ffffff'}, 200, function() {
		$(this).animate({'backgroundColor': '#ffffff', 'color': '#76644a'}, 800);
	});
}
function updateHash() {
	location.replace('#shoe=' + currShoe + '&strap=' + currStrap);
}
function checkChangedHash() {
	if (location.hash == '') {
		return;
	}
	var rawHash = location.hash.substring(1).split('&');
	var changedProduct = false;
	for (var x in rawHash) {
		var pair = rawHash[x].split('=');
		if (pair[0] == 'shoe') {
			if (pair[1] != currShoe) {
				currShoe = pair[1];
				currStrap = 'dflt';
				changedProduct = true;
				filterList('shoe', 'view all');
			}
		} else if (pair[0] == 'strap') {
			if (pair[1] != currStrap) {
				currStrap = pair[1];
				changedProduct = true;
				filterList('strap', 'view all');
			}
		}
	}
	if (changedProduct) {
		updateShoe();
		if (currStrap == 'dflt') {
			hideTopBox('#strapCol', function() {
				$('#strapHiliter').css('top', -27);
			});
		} else {
			showTopBox('#strapCol', function() {
				ensureVisible('strap');
			});
		}
		if (currShoe == 'none') {
			hideTopBox('#shoeCol', function() {
				$('#shoeHiliter').css('top', -27);
			});
			resetMiddle();
		} else {
			showTopBox('#shoeCol', function() {
				ensureVisible('shoe');
			});
			// let's just make sure the hiliter is properly placed
			setTimeout(function() {
				$('#shoeHiliter').css('top', parseInt($('#' + currShoe).position()['top']) + 25)
			}, 500);
		}
		logView('prod');
	}
}
function resetMiddle() {
	$('#currentShoe1, #currentShoe2, #currentShoe3').attr('_showing', 'false').css('z-index', 0).animate({'opacity': 0}, 500);
	$('#instructions').animate({'opacity': 1}, 500).css('display', 'block');
	$('#viewNewAll').show();
	$('#shoeThumbFull, #shoeThumbHoriz, #saveToFavs, #loading').animate({'opacity': 0}, 500);
}
function favLinkClicked(link) {
	startWorking(link);
	if (!loggedIn) {
		// not logged in, show the login dialog
		postRegObj = link;
		showLogin();
	} else {
		// user is logged in, determine what to do
		if (link.id == 'saveToFavs') {
			var id = shoes[currShoe]['pid'];
			var size = $('#shoeSize span.title').text();
			var qty = $('#shoeQty span.title').text();
			var postVars = {'productid': id, 'psize': size, 'amount': qty, 'mode': 'add2wl'};
			var strapItems = '';
			var strapId = '';
			var strapSize = '';
			var strapQty = '';
			if (currStrap != 'dflt') {
				strapId = straps[currStrap]['pid'];
				postVars['strapid'] = strapId;
				strapSize = $('#strapSize span.title').text();
				strapSize = (strapSize == 'L' ? 'Large' : (strapSize == 'M' ? 'Medium' : (strapSize == 'KL' ? 'Large' : (strapSize == 'KM' ? 'Medium' : 'Small'))));
				strapQty = $('#strapQty span.title').text();
			}
			$.post(rootDir + 'cart/modules/Lulu_Custom/cart.php', postVars, function(data) {
				eval(data);
				if (needToAddStrap) {
					needToAddStrap = false;
					postVars = {'productid': strapId, 'psize': strapSize, 'amount': strapQty, 'mode': 'add2wl'};
					$.post(rootDir + 'cart/modules/Lulu_Custom/cart.php', postVars, function(data) {
						eval(data);
						setTimeout(updateCartGlance, 10);
						hideWorking();
						showMessage('Added to favorites.');
					})
				} else {
					setTimeout(updateCartGlance, 10);
					hideWorking();
					showMessage('Added to favorites.');
				}
			})
		} else {
			var fname = $(link).attr('_filter');
			// TODO Generalize this code so it can be used here and in filterList()
			var type;
			var prodList;
			var currItem;
			if ($(link).parents('div.col').attr('id') == 'shoeCol') {
				// filter on my favs for the shoes
				prodList = $('#shoeList a.shoeThumb');
				type = 'shoe';
				currItem = currShoe;
				$('#shoeFilterName span.shopByLabel, #shoeFilter span.shopByLabel').html(fname);
			} else {
				// filter on my favs for the straps
				prodList = $('#strapList a.strapThumb');
				type = 'strap';
				currItem = currStrap;
				$('#strapFilterName span.shopByLabel, #strapFilter span.shopByLabel').html(fname);
			}
			prodList.each(function() {
				var found = false;
				for (var x in wishlist) {
					if (wishlist[x]['id'] == this.id) {
						found = true;
						break;
					}
				}
				if (found) {
					$(this).slideDown(350);
				} else {
					$(this).slideUp(350);
					if (this.id == currItem) {
						// need to hide the selection
						if (type == 'shoe') {
							currShoe = 'none';
							currStrap = 'dflt';
							hideTopBox('#shoeCol', function() {
								$('#shoeHiliter').css('top', -27);
							});
							resetMiddle();
						} else {
							currStrap = 'dflt';
						}
						updateShoe();
						hideTopBox('#strapCol', function() {
							$('#strapHiliter').css('top', -27);
						});
						$('#' + type + 'List').animate({'top': 0}, 400);
					}
				}
			});
			updateHash();
			setTimeout('recalcScrolls($("#' + type + 'Col"))', 360);
			setTimeout('moveHiliter("' + type + '")', 360);
		}
	}
}
var mailRegex = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
function loginUser(unameInput, passwordInput) {
	if ($.trim(unameInput.val()) == '' || !mailRegex.test(unameInput.val())) {
		alert('Invalid Email address.');
		unameInput.focus();
		hideWorking('popSignIn');
		return;
	}
	if ($.trim(passwordInput.val()) == '') {
		alert('Blank password not valid.');
		passwordInput.focus();
		hideWorking('popSignIn');
		return;
	}
	var postVars = {'username': unameInput.val(),
		'password': passwordInput.val(),
		'xid': $.cookie('xid'),
		'usertype': 'C',
		'mode': 'login'
	};
	$.post(location.protocol + '//' + location.host + rootDir + 'cart/include/login.php?js_login=true', postVars, function(data) {
		eval(data);
	})
}
function registerUser(id) {
	if ($.trim($('#' + id + 'Email').val()) == '' || !mailRegex.test($('#' + id + 'Email').val())) {
		alert('Invalid Email address');
		$('#' + id + 'Email').focus();
		hideWorking('regPopBtn');
		return;
	}
	if ($.trim($('#' + id + 'Passwd1').val()) == '') {
		$('#' + id + 'Passwd1').focus();
		hideWorking('regPopBtn');
		return;
	}
	if ($('#' + id + 'Passwd1').val() != $('#' + id + 'Passwd2').val()) {
		alert('Passwords do not match.  Please re-enter');
		$('#' + id + 'Passwd1').val('').focus();
		$('#' + id + 'Passwd2').val('');
		hideWorking('regPopBtn');
		return;
	}
	var postVars = {'email': $('#' + id + 'Email').val(),
		'uname': $('#' + id + 'Email').val(),
		'passwd1': $('#' + id + 'Passwd1').val(),
		'passwd2': $('#' + id + 'Passwd2').val(),
		'usertype': 'C',
		'xid': $.cookie('xid'),
		'js_reg': 'true'
	}
	$.post(location.protocol + '//' + location.host + rootDir + 'cart/register.php?xid=' + $.cookie('xid'), postVars, function(data) {
		eval(data);
	});
}
function loginSuccess() {
	loggedIn = true;
	$('#regPopTop a.regPopClose').trigger('click');
	$(postRegObj).trigger('click');
	updateCartGlance();
}
function hidePopup(evt) {
	evt.preventDefault();
	evt.stopPropagation();
	if ($.browser.msie) {
		$('#shade').css('display', 'none');
	} else {
		$('#shade').fadeOut(500);
	}
	$('#regPop').fadeOut(500, function() {
		// reset the popup in case they come across it again.
		switchPopup('regPop');
	});
}
function recoverPasswd(evt) {
	evt.preventDefault();
	evt.stopPropagation();
	if ($('#recoverPasswdTop').size() == 0) {
		$('<div>').addClass('top').attr('id', 'recoverPasswdTop').html('<span>Forgot your password?</span><a href="#" class="regPopClose"></a>').insertAfter('#regPopTop');
		$('#recoverPasswdTop a.regPopClose').click(function(evt) {hidePopup(evt);hideWorking();});
		$('<div>').addClass('body').attr('id', 'recoverPasswdBody').html('<p>Please enter your e-mail address to recover your password.  Your account information will be sent shortly.<table><tr><td class="label">Email</td><td><input type="text" name="username" id="recoverEmail"/></td><td><a href="#" class="submitButton" id="recoverSubmit"></a></td></tr></table>')
			.insertAfter('#regPopBody');
		$('#recoverSubmit').click(submitRecoverPasswd);
	}
	switchPopup('recoverPasswd');
}
function submitRecoverPasswd(evt) {
	startWorking(this);
	evt.preventDefault();
	evt.stopPropagation();
	if ($.trim($('#recoverEmail').val()) == '' || !mailRegex.test($('#recoverEmail').val())) {
		alert('Invalid Email address');
		return;
	}
	var postVars = {'email': $('#recoverEmail').val(),
		'action': 'recover_password'
	};
	$.post(location.protocol + '//' + location.host + rootDir + 'cart/help.php?section=Password_Recovery&js_confirm=true', postVars, function(data) {
		eval(data);
		hideWorking('recoverSubmit');
	})
}
function switchPopup(switchTo) {
	$('#regPop div.top').each(function() {
		if (this.id == switchTo + 'Top') {
			$(this).show();
		} else {
			$(this).hide();
		}
	});
	$('#regPop div.body').each(function() {
		if (this.id == switchTo + 'Body') {
			$(this).show();
		} else {
			if (switchTo == 'popRecover' && this.id == 'regPopBody' ||
				switchTo == 'regPop' && this.id == 'popRecoverBody') {
				$('#regPopBody').show();
			} else {
				$(this).hide();
			}
		}
	});
}
function showMessage(message) {
	alert(message);
}
function startWorking(item) {
	var pos = $(item).position();
	var div = $('<div>').addClass('working').css({width: $(item).width(), height: $(item).height(),
		top: pos['top'], left: pos['left']}).attr('id', item.id + 'Working');
	var id = item.id;
	if (id == 'saveToFavs') {
		div.css({'background-image': 'url(../images/save_to_favs_working.gif)',
			'left': pos['left'] - 2, 'margin-left': $(item).css('margin-left')});
	} else if (id == 'addShoe') {
		div.css({'background-image': 'url(../images/add_shoe_working.gif)',
			'margin-left': $(item).css('margin-left'), 'margin-top': $(item).css('margin-top')});
	} else if (id == 'addStrap') {
		div.css({'background-image': 'url(../images/add_strap_working.gif)',
			'margin-left': $(item).css('margin-left'), 'margin-top': $(item).css('margin-top')});
	} else if (id == 'recoverSubmit') {
		div.css({'background-image': 'url(../images/submit_working.gif)',
			'top': pos['top'] - 1, 'height': $(item).height() + 3});
	} else if (id == 'popSignIn' || id == 'regPopBtn') {
		div.css({'background-image': 'url(../images/signin_working.gif)',
			'top': pos['top'] - 1, 'height': $(item).height() + 3});
	}
	div.insertAfter(item);
}
function hideWorking(id) {
	if (id == null) {
		$('div.working').remove();
	} else {
		// this has to be done this way because cloning actually doubles up some of the
		// elements with the same id.  Dunno a quick fix for that so this will remedy it.
		id = id + 'Working';
		$('div.working').each(function() {
			if (this.id == id) {
				$(this).remove();
			}
		});
	}
}
function showLogin() {
	var width = $('#regPop').width() / 2;
	var height = $('#regPop').height() /2;
	$('#regPop').css({marginLeft: -width, marginTop: $(window).scrollTop() - height});
	$('#shade').width($(document).width()).height($(document).height());
	if ($.browser.msie) {
		$('#shade').css('display', 'block');
	} else {
		$('#shade').fadeIn(500);
	}
	$('#regPop').fadeIn(500);
}
function popitup(evt) {
	newwindow=window.open($(this).attr('href'),'name','height=511,width=578');
	if (window.focus) {newwindow.focus()}
	evt.preventDefault();
	evt.stopPropagation();
}
function rollbackDropbox(dropbox) {
	if (dropbox.attr('_prevVal')) {
		dropbox.children('span.title').html(dropbox.attr('_prevVal'));
	}
}
function refreshHomePage() {
	window.location.href = baseUrl + 'home/index.html?t=' + new Date().getTime();
}

Are there any similar existing scripts for this one?

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.