var snapManager = function() {

	var previousSuggestQuery = false;
	
	var excludeNvalList = [5585016, 10001, 5002385, 46078, 2564, 8675309, ''];
	
	var init = function() {
		
	};
	
	var toggle = function(elementOfTrigger, navDimId) {
		var naviDimUl = document.getElementById('navDim_' + navDimId)
		var lis = naviDimUl.getElementsByTagName('LI');
		
		// see if existing ctrl is to collapse
		var isExpanded = elementOfTrigger.className === 'snap_collapse';
		var styleClass = isExpanded? 'none' : 'block';
		
		for (var i = 0, noLis = lis.length; i < noLis; i++) {
			lis[i].style.display = styleClass;
		}
		
		if (isExpanded) {
			elementOfTrigger.className = 'snap_expand';
		} else {
			elementOfTrigger.className = 'snap_collapse';
		}					
	};
	
	var navigate = function(url) {
		if (url) {
			var resultsPerPage = document.getElementById('snap_resultsPerPage');
			window.location.href = url + '&recordsPerPage=' +  resultsPerPage.options[resultsPerPage.selectedIndex].value;
		}
	
	};
	
	var navigateForSort = function(url) {
		var sortBox = document.getElementById('snap_sort');
		
		if (url) {
			// handle default
			if (sortBox.selectedIndex === 0) {
				window.location.href = url;
			} else {				
				window.location.href = url + '&Ns=' +  sortBox.options[sortBox.selectedIndex].value;				
			}
		}		
	};
	
	var showMoreInfoBox = function(prodDetails) {
		var moreInfoHolder = document.getElementById('snap_moreProductInfo');
		var moreInfoHtml = '';
		
		if (moreInfoHolder) {
			moreInfoHtml 
				= '<div style="float:left;width:60%;">'	
						+ '<img style="width:90%" src="' + prodDetails['enlargedUrl'] + '"/>'
				 + '</div>'
				 + '<div style="float:right;width:40%;">'	
						+ '<a href="#' + prodDetails['recordId'] + '">'
							+ prodDetails['name'] 
						+ '</a>'
						+ '<p style="padding-top:15px;">'
							+ prodDetails['desc']
						+ '</p>'
						+ getFeaturesHtml(prodDetails['features'])
						+ '<div style="text-align:center;width: 70%">'
							+ getRatingsHtml(prodDetails['ratinginfo'])
							+ '<br/><br/>'
							+ '<a href="#">Add to Comparison Chart</a>'
						+ '</div>' 
				 + '</div>';						 
			moreInfoHolder.innerHTML = moreInfoHtml;
		} 
	};
	
	var getFeaturesHtml = function(features) {
		var i, featuresHtml = '', bullets;
		var featureBullets = null;
		
		if (features) {
			features = features.replace(/\(BUL\)/g, '(bul)'); 
		
			if (features.indexOf('(bul)') === -1) {
				featureBullets = [features];
			} else {
				featureBullets = features.split('(bul)');
			}
		}
		
		if (featureBullets && featureBullets.length) {
			featuresHtml = '<ul>';
			var trimmedFeature = '', bullets = '';
			
			for (i = 0, len = featureBullets.length; i < len; i++) {
				trimmedFeature = jQuery.trim(featureBullets[i]);
				
				if (trimmedFeature) {
					bullets = bullets + '<li>' + trimmedFeature + '</li>';
				}
			}
			featuresHtml = featuresHtml + bullets + '</ul>';							
		}
		return featuresHtml;
	};
	
	var getRatingsHtml = function(ratings) {
		var ratingsHtml = '';
		
		if (ratings) {
			ratingsHtml = ratingsHtml  
				+ '<span style="float:left">Rating : </span>'
				+ '<span class="' + ratings['ratingClass'] + '" style="float:right;" title="' + ratings['ratingText'] + '"/>';
		}
		return ratingsHtml;
	};
	
	var justNavigate = function(url) {
		window.location.href = url;
	};
	
	/**
	 * Handles key stroke events for the search box.
	 */
	var handleKeyTypeAhead = function(e) {
	  var carryForward = false;
	  var kid = (window.event) ? window.event.keyCode : e.keyCode;

	  switch (kid) {
	    case 45:  // "Insert".
	    case 93:  // "Right Click".
	    	//swallow no action
	    	break;
	    case 27:  // "escape".
	    case 13:  // "enter".
	    case 9:  // "tab".
	    	hideSuggestBox();
	    	break;
	    default:
	    	carryForward = true;
	    	// initiate ajax Call
	  }	  
	  
	  if ((kid > 15 && kid < 21) || (kid > 32 && kid < 41)) {
		  carryForward = false;
	  } 

	  return carryForward;
	};	
	
	var snap_mouse_is_inside = false;
	
	var showSuggestBox = function() {
		$("#snap_SuggestBox").show();
		
		// attach handler method on snap suggest box and body
	    $('#snap_SuggestBox').hover(function(){ 
	    	snap_mouse_is_inside = true; 
	    }, function() { 
	    	snap_mouse_is_inside = false; 
	    });
	    
	    $('#snap_searchTerm').hover(function(){ 
	    	snap_mouse_is_inside = true; 
	    }, function() { 
	    	snap_mouse_is_inside = false; 
	    });	    

	    $('body').mouseup(function(){ 
	        if(!snap_mouse_is_inside) {
	        	hideSuggestBox();
	        }
	    });
	};
	
	var hideSuggestBox = function() {
		$("#snap_SuggestBox").hide();
		// remove events that were attahed.
		$("#snap_SuggestBox").unbind('hover');
		$('body').unbind('mouseup');
	};	

	var typeAhead = function(e) {
		
		// filter events on unwanted keys.
		if (!handleKeyTypeAhead(e)) {
			return false;
		}

		// Proceed only if atleast 2 characters are typed.
		if ($("#snap_searchTerm").val().length < 3) {
			$("#snap_SuggestBox").hide();
			return false;
		}		
		var urlParmas = 'D=' + escape($.trim($("#snap_searchTerm").val())) + '&rt=ta&pid=' + snap_PlaceId + '&loc=' + snap_locale + '&plmlblid=' + snap_placementLabelSetId + '&plmid=' + snap_placementId + '&gblid=' + snap_globalLabelSetId;
		var ajaxurl = snap_ImagePath + 'AjaxServlet';
		
		$.ajax({
			   'type': "GET",
			   'url': ajaxurl,
			   'data': urlParmas,
			   'dataType' : "json",
			   'success' : function(resultJson) {
					if (resultJson) {
						var results  = resultJson['results'];
						var query = resultJson['searchQuery'];
						var nVal = '';
						var excludeNval = false;
						for(i=0;i<excludeNvalList.length;i++){
							if(typeAheadRestrictId == excludeNvalList[i]) excludeNval = true;
						}
						if(query.substring(query.indexOf('N=')+2, query.indexOf('&')) != '' && !excludeNval) nVal = '+' + query.substring(query.indexOf('N=')+2, query.indexOf('&'));
						docHtml = '';
						var hasObjects = isJSONHavingMembers(results);
						
						if (hasObjects) {
							var docHtml = '<H6>' + taCategory + '</H6>' 
									+ '<ul>';							
							
							for (navId in results) {
								docHtml += '<li onmouseover="$(this).addClass(\'highlight\')" onmouseout="$(this).removeClass(\'highlight\')">'
											+ '<a onclick="dcsMultiTrack(\'WT.cg_n\',\'PC - Search suggested categories\',\'WT.cg_s\','
											+ '\'' + results[navId] + '\',\'DCS.dcsuri\',window.location.pathname+\'SearchSuggestedCategory\',\'WT.ti\',\'Search Type Ahead Category\')"' 
											+ ' href="' + baseSearchUrl + '&from=typeAhead&N=' + navId + nVal + '">'
											+ results[navId] + '</a>';
								docHtml += '</li>';
								
							}						
							docHtml += '</ul>';
							$("#snap_SuggestBox").html(docHtml);							
							var searchTermTxt = document.getElementById("snap_searchTerm");
							var pos = getPosition(searchTermTxt);
							var suggestBox = document.getElementById("snap_SuggestBox");
							suggestBox.style.left = pos[0] + "px";
							suggestBox.style.top = (pos[1] + searchTermTxt.offsetHeight + 2) + "px";
							
							if ($('#snap_SuggestBox').is(':hidden')) {
								showSuggestBox();
							}
						} else {
							hideSuggestBox();
						}
					}
			   },
			   
			   'error' : function (obj) {
				   hideSuggestBox();
			   }
		});
	};
	
	var isJSONHavingMembers = function(json) {
		var hasObjects = false;
		
		for (key in json) {
			hasObjects = true;
			break;
		} 
		return hasObjects;
	};
	
	var getPosition = function(n, endNode) {
	    var left = 0, top = 0, node = n, done=false;
	    
	    while (!done) {
	    	
	        if(node.offsetLeft!=null)
	                left += node.offsetLeft;
	        if(node.offsetTop!=null)
	                top += node.offsetTop;
	        if(node.offsetParent){
	                node = node.offsetParent;
	        }else{
	                done = true;
	        }
	        if(node == endNode)
	                done = true;
	    }
	    done=false;
	    node = n;
	    while(!done){
	        if(document.all && node.style && parseInt(node.style.borderLeftWidth)){
	                left += parseInt(node.style.borderLeftWidth);
	        }
	        if(document.all && node.style && parseInt(node.style.borderTopWidth)){
	                top += parseInt(node.style.borderTopWidth);
	        }

	        if(node.parentNode)
	                node = node.parentNode;
	        else
	                done=true;
	    }
	    return new Array(left, top);
	};
	
	var searchOnDemand = function(searchTerm) {
		
		if (searchTerm) {
			var searchForm = document.getElementById("snap_searchForm");
			searchForm['Ntt'].value = searchTerm;
			searchForm.submit();			
		}
	};
	
	return {
		init : init,
		toggleNavDimension : toggle,
		navigateByUrl : navigate,
		navigateByUrlForSort : navigateForSort,
		justNavigate : justNavigate,		
		showMoreInfoBox : showMoreInfoBox,
		typeAhead : typeAhead,
		searchOnDemand : searchOnDemand
	}
}();

var snapCompareTrayManager = function() {
	var selectedProducts = null;
	var itemsInTray = null;
	var timer = null;
	
	var init = function() {
		selectedProducts = {};
		itemsInTray = {};
		var itemsToCompare = snap_cookieManager.readCookie('snap_compare');
		
		if (itemsToCompare) {
			selectedProducts = JSON.parse(itemsToCompare);
			itemsInTray = selectedProducts;
			syncWithCheckBoxes();
			
			var compareTray = document.getElementById('snap_compareItemsHolder');
			var togglerTxt = document.getElementById('snap_compareToggler');
			if (!compareTray) {
				return false;
			}
			
			var isProdsPresent = false;
			
			for (product in selectedProducts) {
				isProdsPresent = true;
				break;
			}
			
			if (isProdsPresent) {
				buildTray();
				compareTray.style.display = 'block';			
			} 	
		}
	};
	
	var syncWithCheckBoxes = function() {		
		var compareCheckBoxes = document.getElementsByName('compare');
		
		if (!compareCheckBoxes) {
			return false;
		}
		
		for (var i = 0, len = compareCheckBoxes.length; i < len; i++) {
			if (compareCheckBoxes[i].type === 'checkbox') {
				if (selectedProducts[compareCheckBoxes[i].id]) {
					compareCheckBoxes[i].checked=true;
				} else {
					compareCheckBoxes[i].checked=false;
				}
			}
		}
	}; 
	
	var addRemoveItem = function(product, chkBox) {

		chkBox.checked? addItem(chkBox, product) : removeItem(product['id']);
	};
	
	var addItem = function(chkBox, product) {
		var count = getNumberOfSelected();
			
		if (count === 4) {
			alert(compMaxMsg);
			chkBox.checked = false;
			show();
			return false;
		}
		resetTimer();
		selectedProducts[product['id']] = product;
		resetCookie();
	};
	
	var getNumberOfSelected = function() {
		var count = 0;
		for (var prod in selectedProducts) {
			count++;
		}		
		return count;
	}; 
	
	var removeItem = function(recordSpecId) {
		//This function can be called form the compare bar or the compare page
		if ($('#cp' + recordSpecId).length > 0){
			//Compare bar
			resetTimer();
			$('#cp' + recordSpecId).stop(true,true).fadeOut("slow",function(){
				delete selectedProducts[recordSpecId];
				var selectedProduct = document.getElementById(recordSpecId);		
				if (selectedProduct) {
					selectedProduct.checked = false;
				}
				resetCookie();
			});
		} else {
			//Compare page
			delete selectedProducts[recordSpecId];
			resetCookie();
		}
	};
	
	var removeAll = function() {
		selectedProducts = {};
		snap_cookieManager.eraseCookie('snap_compare');
	};
	
	var resetCookie = function() {
		snap_cookieManager.createCookie('snap_compare', JSON.stringify(selectedProducts), 0);
		showCompareTray();
	};
	
	var compareItems = function(url) {
		var filterQuery = '', count = 0;
		
		for (product in selectedProducts) {
			filterQuery = filterQuery + product + '+';
			count++;
		}
		
		if (count < 2) {
			alert(compMinMsg);
			return false;
		}
	
		if (filterQuery) {
			// create cookie to set a Url from which the compare page was launched
			snap_cookieManager.createCookie('snap_Prev_Url', window.location.href);
			window.location.href = url + '&R=' + filterQuery.substring(0, filterQuery.length-1);
		}
	};
	
	var clearTray = function() {
		var itemsHolder = document.getElementById('snaps_itemsHolder');
		
		if (itemsHolder) {
			while(itemsHolder.childNodes.length > 0) {
				itemsHolder.removeChild(itemsHolder.childNodes[itemsHolder.childNodes.length - 1]);
			}
		} 
		
	};
	
	var showCompareTray = function() {
		var compareTray = document.getElementById('snap_compareItemsHolder');
		var prodCount = getNumberOfSelected();
		
		if (!compareTray) {
			return false;
		}
				
		if (prodCount > 0) {
			clearTray();
			buildTray();
			//Fade the tray in if this is the first product
			if (prodCount === 1){
				$('#snap_compareItemsHolder').fadeIn("slow");		
			}
			//Now move it up
			show();
		} else {			
			clearTray();
			//window.clearTimeout(timer);
			clearTimer();
			$('#snap_compareItemsHolder').stop(true,true).fadeOut("slow");
			$('#snap_compareItemsHolder').css('bottom','-108px');	
			$('#snap_compareItemsHolder').addClass('collapsed');		
		}
	}; 
	
	
	var resetTimer = function() {
		//if (timer != null) window.clearTimeout(timer);
		clearTimer();		
		timer = window.setTimeout(function() {
					dockUnder();
				}, 5000);		
	}
	
	var clearTimer = function() {
		if (timer != null) window.clearTimeout(timer);			
	}
	
		
	var buildTray = function() {
		var itemsHolder = document.getElementById('snaps_itemsHolder');
		var currentProd = null, tdObj, tdHtml, delimiter;		 
		var k = 0;
		for (product in selectedProducts) {			
			tdHtml = '';
			currentProd = selectedProducts[product];
			tdObj = itemsHolder.appendChild(document.createElement("DIV"));
			tdObj.className = 'prodCell';
			tdObj.id = 'cp' + currentProd['id'];
			delimiter = ((currentProd['url'].indexOf("?") != -1) ? '&' : '?');
			tdHtml = tdHtml
					+ '<A CLASS="prodRemove caption"'
					+ ' onclick="snapCompareTrayManager.removeItem(\'' + currentProd['id'] + '\')">' + compRemove + '</A>'
					+ '<DIV CLASS="imgContainer"><img src="' + currentProd['url'] + delimiter+'boundedSize=40" ALT="' + currentProd['pn'] + '" TITLE="' + currentProd['pn'] + '"/></DIV>'
					+ '<DIV CLASS="prodInfo texttwo">'
					+ '<a onclick="dcsMultiTrack(\'WT.cg_n\',\'PC - Comparison tray clicks\',\'WT.cg_s\',\''
					+ currentProd['pn'] + '\',\'DCS.dcsuri\',window.location.pathname+\'CompareTrayClicks\',\'WT.ti\',\'Compare Tray Clicks\');" href="'
					+ currentProd['dPUrl']
					+ '">'              
					+ currentProd['pn']
					+ '</a>';              
			tdObj.innerHTML = tdHtml;
		}
		$('#compareCount').html(getNumberOfSelected());		
	};
	
	var toggleDisplayTray = function() {
		if ($('#snap_compareItemsHolder').hasClass('collapsed')) {	
			show();
		} else {
			dockUnder();
		}
	};
	

	var show = function() {
		resetTimer();
		$('#snap_compareItemsHolder').removeClass('collapsed');
		$('#snap_compareItemsHolder').stop(true,true).animate({bottom:'0px'},'slow',function(){
		//	$('#snap_compareItemsHolder').removeClass('collapsed');
		});	
	};
	
	var dockUnder = function() {
		//window.clearTimeout(timer);
		clearTimer();
		$('#snap_compareItemsHolder').addClass('collapsed');
		$('#snap_compareItemsHolder').stop(true,true).animate({bottom:'-108px'},'slow',function(){
		//	$('#snap_compareItemsHolder').addClass('collapsed');
		});
	};
	
	var removeAllFromTray = function(){
		//window.clearTimeout(timer);
		clearTimer();
		for (product in selectedProducts) {
			removeItem(selectedProducts[product]['id']);
		}
	};
	
	var removeAndNavigate = function(url, recordId) {
		
		if (!selectedProducts) {
			snapCompareTrayManager.init();
		}
		
		var count = getNumberOfSelected();
		
		if (count === 1) {
			var urlInCookie = snap_cookieManager.readCookie('snap_Prev_Url');
			
			if (urlInCookie) {
				url = urlInCookie;
			}					
		}		
		
		if (recordId) {
			removeItem(recordId);			
		} else {
			removeAll();
			var urlInCookie = snap_cookieManager.readCookie('snap_Prev_Url');
			
			if (urlInCookie) {
				url = urlInCookie;
			}			
		}
		snapManager.justNavigate(url);
	};
	
	var back = function(){
		var urlInCookie = snap_cookieManager.readCookie('snap_Prev_Url');
		snapManager.justNavigate(urlInCookie);
	}
	
	return {
		addItem : addItem,
		removeItem : removeItem,
		compareItems : compareItems,
		removeAll : removeAll,
		addRemoveItem : addRemoveItem,
		toggleDisplayTray : toggleDisplayTray,
		removeAndNavigate : removeAndNavigate,
		removeAllFromTray : removeAllFromTray,
		resetTimer : resetTimer,
		clearTimer : clearTimer,
		back: back,
		init : init
	};
}();

var snap_cookieManager = function() {

	var createCookie = function(name, value, days) {
		var expires = '';
		
		if (days) {
			var date = new Date();
			date.setTime(date.getTime() + (days*24*60*60*1000));
			var expires = "; expires=" + date.toGMTString();
		}
		document.cookie = name + "=" + escape(value) + expires + "; path=/";
	};

	var readCookie = function(name) {
		var i, len, c;
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		
		for(i = 0, len = ca.length; i < len; i++) {
			c = ca[i];
			
			while (c.charAt(0) === ' ')  {
				c = c.substring(1, c.length);
			}
			
			if (c.indexOf(nameEQ) === 0) {
				return unescape(c.substring(nameEQ.length, c.length));
			}
		}
		return null;
	};

	var eraseCookie = function(name) {
		createCookie(name, "", -1);
	};
	
	return {
		createCookie : createCookie,
		readCookie : readCookie,
		eraseCookie : eraseCookie
	};
}();