/*
** SearchSpring Product Compare
** Copyright (c) 2010 B7 Interactive, LLC. All rights reserved.
**
** Depenencies: jquery v1.3.1, jqueryui v1.7.1, json2, jquery.cookie
**/
SearchSpring.Compare = function(){
	var version = 2;
	var compareData = {lists:[], currentList:[]};
	var maxItems = 5;
	var domain = window.location.hostname;
	var contextName = null;
	var contextUrl = window.location.href;
	var $j = jQuery;
	return{
		currentComparison:[],
		
		init:function(options) {
		
			if (options) {
				if (options.maxItems) {
					options.maxItems = parseInt(options.maxItems);
					if (options.maxItems > 1 && options.maxItems < 20) {
						maxItems = options.maxItems;
					}
				}
				if (options.domain) {
					domain = options.domain;
				}
				if (options.contextName) {
					contextName = options.contextName;
				}
				if (options.contextUrl) {
					contextUrl = options.contextUrl;
				}
			}
			
			SearchSpring.Core.addOnLoadEvent(SearchSpring.Compare.load);

			$j('#searchspring-compare-list-save').submit(function() {
				
				if (!SearchSpring.Core.cookiesEnabled()) {
					alert('Please turn on cookies to save your list');
					return false;
				}

				var name = $j('#searchspring-compare-list-save input[name="name"]').val();
				if (name.length < 3) {
					alert('Enter a good name for this comparison list (something longer than 3 characters please)');
					$j('#searchspring-compare-list-save input[name="name"]').focus();
					return false;
				}

				SearchSpring.Compare.currentComparison.name = name;
				SearchSpring.Compare.currentComparison.tags = $j('#searchspring-compare-list-save input[name="tags"]').val();

				var foundList = false;
				for (var i = 0; i < compareData.lists.length; i++) {
					if (SearchSpring.Compare.currentComparison.id == compareData.lists[i].id) {
						compareData.lists[i] = SearchSpring.Compare.currentComparison;
						foundList = true;
						break;
					}
				}

				if (!foundList) {
					compareData.lists.push(SearchSpring.Compare.currentComparison);
				}
				
				SearchSpring.Compare.loadSavedComparisonLists();

				$j.cookie('__sscls', JSON.stringify(compareData), {domain: domain.match(/^[^\.]+(.*)$/)[1], path: '/'});
				
				$j('#searchspring-compare-list-save').before('<div id="searchspring-compare-saved-message" class="searchspring-message">Your list has been saved</div>');
				
				$j('#searchspring-compare-saved-message').fadeIn(500).fadeOut(4000);

				return false;
			});

			$j('#highlight-similarities').click(function() {
				$j('.different').removeClass('highlight-field');

				var similarFeatures = $j('.similar').size();
				if (similarFeatures < 1) {
					alert('None of these features are exactly the same');
				} else {
					$j('.similar').removeClass('highlight-field');
					$j('.similar').addClass('highlight-field');
				}

				return false;
			});

			$j('#highlight-differences').click(function() {
				$j('.similar').removeClass('highlight-field');

				var differentFeatures = $j('.different').size();
				if (differentFeatures < 1) {
					alert('None of these features are different');
				} else {
					$j('.different').removeClass('highlight-field');
					$j('.different').addClass('highlight-field');
				}

				return false;
			});

		},
		
		load: function() {
		
			// Init list
		
			for (var i = 0; i < maxItems; i++) {
				SearchSpring.Compare.addEmptyCompareSlot();
			}

			// Load our compare history
			var cookieData = $j.cookie('__sscls');
			if (null != cookieData) {
				compareData = JSON.parse(cookieData);
			}
			
			if (compareData.currentList.length > 0) {
				SearchSpring.Compare.showComparePanel();
			}
			
			for (var i = 0; i < compareData.currentList.length; i++) {
				SearchSpring.Compare.addItemToComparePanel(compareData.currentList[i]);
			}
			
			SearchSpring.Compare.loadSavedComparisonLists();
		},
		
		addEmptyCompareSlot: function() {
			$j('.searchspring-compare-panel ul.compare-items').each(function(i, ul){
				var li = document.createElement('li');
				li.className = '';
				li.innerHTML = '<input type="hidden" name="id" value=""/><span class="container"></span>';
				ul.appendChild(li);
			});
		},
		
		loadSavedComparisonLists: function() {
			
			if (compareData.lists.length > 0) {
				
				$j('.searchspring-compare-saved-list-container').show();
				
				// Populate our saved lists history
				var myList = $j('.searchspring-compare-saved-lists');
				var myListItems = '<ul>';

				$j.each(compareData.lists, function(i, list){
					if (SearchSpring.Compare.currentComparison.id == list.id) {
						SearchSpring.Compare.currentComparison.name = list.name;
						SearchSpring.Compare.currentComparison.tags = list.tags;
						$j('#searchspring-compare-list-save input[name="name"]').val(SearchSpring.Compare.currentComparison.name);
						$j('#searchspring-compare-list-save input[name="tags"]').val(SearchSpring.Compare.currentComparison.tags);
					}

					var params = '';
					$j.each(list.items, function(j, val){
						params += '&id=' + escape(val);
					});

					myListItems += '<li>';
					if (SearchSpring.Compare.currentComparison.id == list.id) {
						myListItems += '<strong>' + list.name + '</strong> (You\'re viewing this list now)';
					} else {
						myListItems += '<a href="/compare/index?' + params + '"><strong>' + list.name + '</strong></a>';
						myListItems += ' (' + list.items.length + ' items';
						/*
						if (list.tags.length > 0) {
							myListItems += '; Tags: ' + list.tags;
						}
						*/
						myListItems += ')';
						if (myList.hasClass('inline-list') && i+1 < compareData.lists.length) myListItems += ', ';
					}
					myListItems += '</a></li>';
				});

				myListItems += '</ul>';
				myList.html(myListItems);
			}
		},
		
		toggle: function(checkbox, item) {
			
			SearchSpring.Compare.showComparePanel();
			
			var itemId = item.sku.replace(/[^a-z0-9]/i, '');
		
			//var existingItems = $j('.searchspring-compare-panel ul li[class="item_' + itemId + '"]');
			//var inCurrentList = $j.inArray(compareData.currentList, item);

			var inCurrentList = false;
			for (var i = 0; i < compareData.currentList.length; i++) {
				if (item.sku == compareData.currentList[i].sku) {
					inCurrentList = true;
					if (!checkbox.checked) {
						compareData.currentList.remove(i);
					}
				}
			}
			
			if (checkbox.checked) {
				if (!inCurrentList) {
					
					if (compareData.currentList.length >= maxItems) {
						alert('You can only compare ' + maxItems + ' items at a time');
						checkbox.checked = false;
						return false;
					}
					
					// Add the item
					compareData.currentList.push(item);
					$j.cookie('__sscls', JSON.stringify(compareData), {domain: domain.match(/^[^\.]+(.*)$/)[1], path: '/'});
					SearchSpring.Compare.addItemToComparePanel(item);
				}
			} else {
				if (inCurrentList) {
					// Remove the item's thumbnail
					SearchSpring.Compare.remove(item.sku);
					//existingItems.remove();
				}
				if (compareData.currentList.length < 1 && compareData.lists.length < 1) {
					SearchSpring.Compare.hideComparePanel();
				}
			}
			
			$j.cookie('__sscls', JSON.stringify(compareData), {domain: domain.match(/^[^\.]+(.*)$/)[1], path: '/'});
		},
		
		showComparePanel:function(){
			var p = $j('.searchspring-compare-panel');
			if (p && p.length > 0 && 'block' != p[0].style.display) {
				p.show();
				if (!SearchSpring.Core.cookiesEnabled()) {
					p.prepend('<div class="searchspring-message searchspring-warning">Turn cookies on to save your compare list</div>');
				}
			}
		},
		
		hideComparePanel:function(){
			var p = $j('.searchspring-compare-panel');
			if (p && p.length > 0 && 'block' == p[0].style.display) {
				p.hide();
			}
		},
		
		addItemToComparePanel: function(item) {
			$j('.compare[value="' + item.sku + '"]').attr('checked', 'checked');
			var itemId = item.sku.replace(/[^a-z0-9]/i, '');
			$j('.searchspring-compare-panel ul.compare-items').each(function(i, ul){
				var added = false;
				$j(ul).children('li').each(function(i, li){
					if ('' == li.className) {
						li.className = 'item_' + itemId;
						li.innerHTML = '<input type="hidden" name="id" value="' + item.sku + '"/><span class="container"><a class="remove" href="" onclick="SearchSpring.Compare.remove(\'' + item.sku + '\');return false;" title="Remove" style="display:block;"><img src="http://pro.search-spring.com/assets/img/icons/close.gif"/></a><div class="thumbnail-wrap" style="display:block;"><a href="#" onclick="return false;" title="' + item.name + '"><img class="thumbnail-image" src="' + item.image + '" alt="' + item.name + '"/></a></div></span>';
						added = true;
						return false;
					}
				});
				
				if (false == added) {
					alert('Your comparison list is full. Remove an item before adding another.');
				}
			});
		},

		remove: function(sku) {
			var itemId = sku.replace(/[^a-z0-9]/i, '');
			$j('.searchspring-compare-panel ul li[class="item_' + itemId + '"]').remove();
			$j('.searchspring-compare-panel ul.compare-items').each(function(i, ul){
				for (var i = $j(ul).children('li').length; i < maxItems; i++) {
					SearchSpring.Compare.addEmptyCompareSlot();
				}
			});
			
			$j('.compare[value="' + sku + '"]').attr('checked', '');
			for (var i = 0; i < compareData.currentList.length; i++) {
				if (sku == compareData.currentList[i].sku) {
					// Remove the item
					compareData.currentList.remove(i);
				}
			}
			$j.cookie('__sscls', JSON.stringify(compareData), {domain: domain.match(/^[^\.]+(.*)$/)[1], path: '/'});
			if (compareData.currentList.length < 1 && compareData.lists.length < 1) {
				SearchSpring.Compare.hideComparePanel();
			}
		},

		reset: function() {
			compareData.currentList = [];
			$j.cookie('__sscls', JSON.stringify(compareData), {domain: domain.match(/^[^\.]+(.*)$/)[1], path: '/'});
			$j('.searchspring-compare-panel ul li').remove();
			$j('.compare').attr('checked', '');
			SearchSpring.Compare.hideComparePanel();
		},
	
		compare: function() {
			var url = 'http://' + domain + '/compare/index?';
			if (contextName) {
				url += 'ctx=' + encodeURIComponent(contextName);
			}
			if (contextUrl) {
				url += '&url=' + encodeURIComponent(contextUrl);
			}
			var count = 0;
			for (var i = 0; i < compareData.currentList.length; i++) {
				if (compareData.currentList[i].sku.length == 0) continue;
				if (++count > maxItems) {
					alert('You can compare up to ' + maxItems + ' items at once');
					return;
				}
				url += '&id=' + escape(compareData.currentList[i].sku);
			}
			if (count > 1) {
				window.location.href = url;
			} else {
				alert('Please select 2 or more items to compare');
			}
		}
	}
}();