/**
 * Product comparsion widget for search and browse
 * Allow customers to select comparison products and manage their 
 * selected list as well as submit for comparison.
 * The widget is applied as a progressive enhancement to exisiting functionality.
 * 
 * @author Rozario Chivers, Anna Huang, Tony Kabalan, James Baker (created 09:00 11/02/2008)
 */

if (!console) var console = {log: function() {}};

// set up Argos Product Comparison namespace
if (!argos) var argos = {};
if (!argos.product) argos.product = {};

argos.product.comparison.browse = {	
	WIDGET_ID : "comparisonlist",		// widget handle
	TRANS_SPEED : 500,					// fade in and fade out speed
	OFFSET : {x : 512, y : 370},		// default pixel positioning for widget 
	MAX_PRODUCTS_SIZE : 10, 			// maximum number of products to maintain in list
	MIN_PRODUCTS_SIZE : 1, 				// minimum number of products to maintain in list
	CONFIG_NAME: "comparisonConfig",	// persistence name for store/retrieve config object
	SEARCH_PARAM_1 : "searchTerms",		// search parameter
	SEARCH_PARAM_2 : "q", 				// search parameter
	LAYOUT : {gallery: "galleryview", list: "listview"},	// available layout modes for product page display, must match to cookie value
	STATUS: {enabled: "enabled", disabled: "disabled"},
	STATE : {closed: "closed", minimised: "minimised", maximised: "maximised", hidden: "hidden", disabled: "disabled"},	// available states of the widget can be in
	PAGE_TYPE: {browse: "browse", search: "search"},
	searchValue : "",
	config : {
		layout: "list", 				// the mode the products are shown, available values in LAYOUT
		state: "hidden",				// default, change over user action
		status: "disabled",
		pageName: null, 
		pageType: "browse",
		section: null, 
		category: null, 
		searchValue: null
	},			
	
	// initiliase product comparison for lister pages
	init : function() {
		// exit conditions
		if (!document.getElementById || !document.getElementsByTagName) return false;	// required JavaScript functionality not available
		if ($(".comparebar").length==0) return; 		// products not comparable
		if (currentCategoryId === undefined) return;	// no category, invalid to compare
		if ($(".product").length==0) return;			// no products in the page
		
		var comparison = argos.product.comparison;		// reduce namespace
		var browse = argos.product.comparison.browse;		// reduce namespace
		
		// get max no. of products for comparison from markup and reset default to maximum selections
		var maxproducts = parseInt($(".comparebar .maxcompproducts")[0].innerHTML);
		if (!isNaN(maxproducts)) browse.MAX_PRODUCTS_SIZE = maxproducts;
		
		// restore config data 	
		var disabled = (browse.STATUS.disabled == browse.config.status);	
		
		browse.restoreSavedConfig();
		browse.config.pageName = ($("body").attr("class")) ? $("body").attr("class").split(" ")[0] : "notfound";
		browse.config.section = ($("#outerwrap").attr("class")) ? $("#outerwrap").attr("class").split(" ")[0] : "notfound";	
		if (disabled) {
			browse.config.state = browse.STATE.closed;
			browse.config.status = browse.STATUS.disabled;
		} else {			
			browse.config.status = browse.STATUS.enabled;
		}
		
		// find page related config data
		var url = window.location.href;
		var comms = argos.comms.url;		
		var searchValue = comms.getParameter(url, browse.SEARCH_PARAM_1) || comms.getParameter(url, browse.SEARCH_PARAM_2);	
		browse.config.searchValue = searchValue
		browse.config.category = searchValue || currentCategoryId;
		browse.config.pageType = (searchValue) ? browse.PAGE_TYPE.search : browse.config.pageType;

		// restore / clear saved data
		var savedConfig = argos.utils.persistence.retrieve(browse.CONFIG_NAME);
		if (!savedConfig || !savedConfig.category || savedConfig.category.toLowerCase() != browse.config.category.toLowerCase()) {
			comparison.removeAllSavedProducts();	// change of category, remove all selected products
			browse.saveConfig();
		} else {
        	comparison.setProducts(comparison.retrieveSavedProducts());  	// restore saved product list in memory
		}
		
		// initialise page product data	
		var productDivs = $(".product");	
		for(var i=0; i<productDivs.length;i++) {
			var productDiv = productDivs[i];
			var desc = $(productDiv).find(".description a").text();
			var title = desc.substring(0, desc.indexOf(","));
			var partNum = $(productDiv).find(".partnum").text().replace("/", "");
			var checkbox = $(productDiv).find("input")[0];	
	
			if (!desc || !partNum || !checkbox) {
				continue;	// product invalid or not comparable 
			}
			
			// construct product detail page (PDP) URL
			var productParam = "/partNumber/";
			var hrefTemp = $(productDiv).find(".description a").attr("href");	
			var partNumberURL = hrefTemp.substring(0, hrefTemp.indexOf(productParam)); 	// PDP URL prefix			
			var href = partNumberURL + productParam + partNum + ".htm";	// PDP URL

			var product = new comparison.Product(partNum, title, checkbox.value, desc, href);
			comparison.replaceProduct(partNum, product);
			
			checkbox.checked = comparison.getProduct(partNum) != null;
			
			browse.registerSelectProductEvent(checkbox, product);	// attach product click event
		}

		$(".product .complabel").click(browse.compareAllEvent);
		
		// initialise widget markup
		browse.initHTML();				

		// restore saved layout (not by widget) for list/gallery, this overrides widget saved config
		var layoutStatus = argos.page.getCookie("argosswitchview");
		if (layoutStatus == browse.LAYOUT.gallery) {
			browse.config.layout = browse.LAYOUT.gallery;
		} else if (layoutStatus == browse.LAYOUT.list) {
			browse.config.layout = browse.LAYOUT.list;
		}
		
		$(".comparebar .compareselected").click(browse.compareAllEvent);
		$(".comparebar .btnshowlist").click(function() {			
			browse.config.state = browse.STATE.maximised;
	
			if ($(this).hasClass("btnbase") ) {
				browse.widgetPreviewCoords("base");
			} else {
				browse.widgetPreviewCoords("default");
			}					
						
			browse.saveConfig();
			
			// determine whether top or base preview button is clicked
			// and call preview display function (refactored preview coords into one function)
			return false;	
		});

		// minimise and maximise widget button
		$("#comparisonlist #btnminmax").click(function() {
			// toggle event
			if (browse.config.state == browse.STATE.minimised) {
				browse.maximiseEvent();
			} else {
				browse.minimiseEvent();
			}
		});

		browse.registerCloseEvent($("#btnclose")[0]);
		browse.registerRemoveAllProductsEvent($("#btnclearall")[0]);
		browse.registerCompareAllEvent($("#btncompareall")[0]);
		
		// remove existing form onsubmit to use widget code
		document.comp.onsubmit = function(){};			
	
		// page layout switch buttons for list/gallery
		// bottom gallery layout switcth button
		$(".headersort .viewselector .list .action").click(function() {	
			browse.layoutEvent(browse.LAYOUT.list, "default");
		});
		
		// bottom gallery layout switcth button
		$(".headersort .viewselector .gallery .action").click(function() {	
			browse.layoutEvent(browse.LAYOUT.gallery, "default");
		});		
		
		// bottom gallery layout switcth button
		$(".footersort .viewselector .list .action").click(function() {	
			browse.layoutEvent(browse.LAYOUT.list, "base");
		});
		
		// bottom gallery layout switcth button
		$(".footersort .viewselector .gallery .action").click(function() {	
			browse.layoutEvent(browse.LAYOUT.gallery, "base");
		});		
		
		// restore show widget state		
		if (browse.config.state == browse.STATE.maximised) {			
			$.onElementReady("#listerlhs", function() {
				$('#topcompare .comparebar .btnshowlist').click();		// show widget
			});				
			window.location.href = '#content'; // ensures top preview of widget is set on refresh/paging navigation
		} else if (browse.config.state == browse.STATE.minimised) {	
			$.onElementReady("#listerlhs", function() {	
				$('#topcompare .comparebar .btnshowlist').click();	// show widget									
				$('#comparisonlist .btnminimise').click(); 			// restore minimised state
				}
			);	
		}
	},


	/** UI REGISTER EVENTS **/
	registerSelectProductEvent : function(obj, product) {	
		var comparison = argos.product.comparison;
		var browse = argos.product.comparison.browse;
					
		product.bindObj("checkbox", obj);
		
		obj.onclick = function() {
			if (this.checked) {
				browse.addProductEvent(product);
			} else {
				browse.removeProductEvent(product.partNum);
			}
			var posX = browse.OFFSET.x;
			var posY = argos.page.getPosition(this).y;
					
			if (browse.LAYOUT.gallery == browse.config.layout) {
				// reset X position relative to item clicked not default X offset
				posX = $(this).offset().left;
				
				// deduct outerwrap offset to compensate for screen resolution				
				posOuterwrapX = $("#outerwrap").offset().left;
				posX = posX - posOuterwrapX;
				
				//browser handling for offset quirks
				posX = browse.galleryXCoords(posX);				
			}
			
			browse.widgetPopupCoords(posX,posY);
			browse.saveConfig();
			this.focus(); 					//ensures that focus is set on the checkbox after load
			
			$("#"+browse.WIDGET_ID).focus(); 	//ensures that focus  is then set to the widget after load
			browse.saveConfig();
		}
	},

	registerRemoveAllProductsEvent : function(obj) {
		obj.onclick = function() {
			argos.product.comparison.browse.removeAllProductsEvent();	
		}
	},

	registerCompareAllEvent : function(obj) {
		obj.onclick = function() {
			argos.product.comparison.browse.compareAllEvent();	
		}
	},	

	registerAddProductEvent : function(obj, product) {
		obj.onclick = function() {
			argos.product.comparison.browse.addProduct(product);
		}
	},	

	registerRemoveProductEvent : function(obj, partNum) {
		obj.onclick = function() {
			argos.product.comparison.browse.removeProductEvent(partNum);	
		}
	},	

	registerShowEvent : function(obj) {
		obj.onclick = function() {
			argos.product.comparison.browse.showEvent();
		}
	},

	registerCloseEvent : function(obj) {	
		obj.onclick = function() {				
			argos.product.comparison.browse.closeEvent();
		}
	},

	registerMinimiseEvent : function(obj) {	
		obj.onclick = function() {				
			argos.product.comparison.browse.minimiseEvent();
		}
	},

	registerMaximiseEvent : function(obj) {	
		obj.onclick = function() {	
			argos.product.comparison.browse.maximiseEvent();
		}
	},

	
	/** UI EVENTS **/
	layoutEvent : function(layout, previewContext) {
		var browse = argos.product.comparison.browse;
		browse.config.layout = layout;
		browse.widgetPreviewCoords(previewContext);	
		browse.saveConfig();		
	},
		
	removeAllProductsEvent : function() {
		var comparison = argos.product.comparison;	
		var browse = argos.product.comparison.browse;
		
		var productList = comparison.retrieveLocalProducts();		
		for (var key in productList) {
			var product = productList[key];
			if (product.getObj!=="undefined" && product.getObj("checkbox")!=="undefined") {
				product.getObj("checkbox").checked = false;
			}
		}
		comparison.removeAllSavedProducts();	
		$("#comparisonlist #products a .comparedesc").css({background:"#fb9", color:"#fff"});
		$("#products ul").fadeOut(browse.TRANS_SPEED, function() {
			browse.render(); // render againt to update product count etc
		});
	},	

	compareAllEvent : function() { 
		var comparison = argos.product.comparison;	
		var browse = argos.product.comparison.browse;
		
		var productList = comparison.retrieveLocalProducts();
		
		// validate submission
		if (productList.length < browse.MIN_PRODUCTS_SIZE || productList.length > browse.MAX_PRODUCTS_SIZE) {
			if (browse.STATUS.disabled == browse.config.status) {
				if (productList.length < browse.MIN_PRODUCTS_SIZE) {
					alert("Please select at least 2 items to compare product features.");			
				} else if(productList.length > browse.MAX_PRODUCTS_SIZE) {
					alert("Sorry you can only select up to " + browse.MAX_PRODUCTS_SIZE + " items to compare product features.");		
				}
			} else {		
				browse.config.state = browse.STATE.maximised;
				
				// widget display position
				var posX = argos.page.getPosition(this).x;
				var posY = argos.page.getPosition(this).y;	
			
				if ($(this).hasClass("complabel")) { // click from product listing				
					posX = browse.OFFSET.x;	
					posY = argos.page.getPosition($(this).parent().find(".compcheck")[0]).y;
								
					if (browse.config.layout == browse.LAYOUT.gallery) {
						// reset X position relative to item clicked not default X offset
						posX = $(this).offset().left;
					
						// deduct outerwrap offset to compensate for screen resolution				
						posOuterwrapX = $("#outerwrap").offset().left;
						posX = posX - posOuterwrapX;
						
						//browser handling for offset quirks
						// set compare param to true
						posX = browse.galleryXCoords(posX,true);
					}
					
					// popup function refactored	
					browse.widgetPopupCoords(posX, posY);	
								
				} else if ($(this).hasClass("btnbase")) {
					// determine whether top or base preview button is clicked
					// and call preview display function (refactored preview coords into one function)
					browse.widgetPreviewCoords("base");
				} else {
					browse.widgetPreviewCoords("default");
				}			
				browse.saveConfig();
			}
		} else {	// validated, process submission for comparison	
			var comparisonForm = document.comp;			
			// add all missing products to the form from the saved copy
			var orderedIds = "";
			for (var i=0; i<productList.length; i++) {
				var product = productList[i];
				if (product.getObj === "undefined" || product.getObj("checkbox") === "undefined") {
					var input = document.createElement("input");
					input.type = "hidden";
					input.id = product.productId;
					input.name = "compIds";
					input.value = product.productId;
					comparisonForm.appendChild(input);
				}
				
				orderedIds += product.productId + "_";
			}	
			
			// define ordering for result page			
			var input = document.createElement("input");
			input.name = "orderedIds";
			input.type = "hidden";
			input.value = orderedIds;
			comparisonForm.appendChild(input);
		
			document.comp.submit(); 
		}
		
		return false;		
	},	

	// remove existing and push new product to the end of list
	addProductEvent : function(product) {
		var comparison = argos.product.comparison;	
		var browse = argos.product.comparison.browse;
				
		// display maximised state on first click on first landing
		var savedConfig = browse.retrieveSavedConfig();
		if (browse.STATE.hidden == browse.config.state) {
			browse.config.state = browse.STATE.maximised;
			browse.saveConfig();
		}		
		
		var productPanel = $("#products");
		if (comparison.productList.length < browse.MAX_PRODUCTS_SIZE) {	
			// remove if already selected and add again to have 
			// up-do-date product data caused by cases like backend data change
			comparison.removeProduct(product.partNum); 
			comparison.addProduct(product);
			comparison.saveProducts();
			if (browse.STATE.closed !== browse.config.state && browse.STATUS.disabled !== browse.config.status) {
				browse.render();
				
				if (browse.STATE.maximised == browse.config.state) {
					// correct last product scrollTo for IE
					$(productPanel)[0].scrollTop = $(productPanel)[0].scrollHeight;	
					
					// deal with Safari style order bug
					if (!$.browser.safari) { 
						$("#compare" + product.partNum).css({display: "none"});
					}
					
					$("#compare" + product.partNum+" a").focus();	// commented out to fix page jumping issue
					$("#compare" + product.partNum).fadeIn(browse.TRANS_SPEED);
				}	
			}	
		} else { 
			if (browse.STATUS.disabled == browse.config.status) {				
				alert("Sorry you can only select up to " + browse.MAX_PRODUCTS_SIZE + " items to compare features.");
				if(product.getObj!=="undefined" && product.getObj("checkbox")!="undefined") {
					product.getObj("checkbox").checked = false;					
				}
			} else {
				// max number of selection reached	
				browse.config.state = browse.STATE.maximised;
				browse.render();
				
				var errorMessage = "You have already selected "
									+ comparison.productList.length
									+ " items to compare, to add this item please remove one from below.";
				errorMessage = "<a></a><span class=\"error\">" + errorMessage + "</span>"; // prefix empty a tag for focus			
	
	
				var listContent = $(productPanel).html();
				$(productPanel).html(errorMessage + listContent);
	
				product.getObj("checkbox").checked = false;
				
				// Scroll to top of list to show message (mostly for IE)
				$(productPanel)[0].scrollTop = 0;
				$(productPanel).find("a")[0].focus();
			}
		}
	},

	removeProductEvent : function(partNum) {
		var comparison = argos.product.comparison;	
		var browse = argos.product.comparison.browse;
		browse.render(); // render old data then fade off product on removal (visual effect)
		
		var product = comparison.getProduct(partNum);
		if (product.getObj !== "undefined" && product.getObj("checkbox") !== "undefined") {
			product.getObj("checkbox").checked = false;
		}
		comparison.removeProduct(partNum);
		comparison.saveProducts();
		if (browse.STATE.disabled !== browse.config.state) {
			if (browse.STATE.maximised == browse.config.state) {
				// maximised state, update widget with visual effects
				var productLine = $("#compare" + partNum)[0];
				var productLink = $(productLine).find("a")[0];
			
				$(productLink).focus();				
				$(productLink).css({background:"#fb9", color:"#fff"});
				$(productLine).fadeOut(browse.TRANS_SPEED, browse.render);	
			} else if (browse.STATE.minimised == browse.state) {
				// minimised state, update widget with no special effects
				browse.render();
			}
		}
	},
	
	showEvent : function(pos) {
		var browse = argos.product.comparison.browse;	
		pos.x = pos.x || browse.OFFSET.x;	
		pos.y = pos.y || browse.OFFSET.y;	
		
		browse.config.state = browse.STATE.maximised;
					
		browse.saveConfig();
		browse.render(pos);		
	},

	closeEvent : function() {
		var browse = argos.product.comparison.browse;
		browse.config.state = browse.STATE.closed;
			
		$("#"+browse.WIDGET_ID).fadeOut(browse.TRANS_SPEED, function() {
			$(this).find("#products").empty(); // remove all product objects to release resources (prevent memory leak etc)
		});

		browse.saveConfig();
	},

	maximiseEvent : function() {
		var browse = argos.product.comparison.browse;
		
		$('#products').fadeIn('slow');
		browse.config.state = browse.STATE.maximised;
		browse.render();
		browse.saveConfig();
	},

	minimiseEvent : function() {
		var browse = argos.product.comparison.browse;
		
		$('#products').fadeIn('slow');
		browse.config.state = browse.STATE.minimised;
		browse.render();
		browse.saveConfig();
	},	


	/** UI FUNCTIONS **/

	generateProductHTML: function(index, product) {
		var productContent = product.desc;
		productContent = '<span class="comparedesc">' + productContent + '</span>';
		productContent = '<span class="compareindex">' + index + '.</span>' + productContent;
		productContent = '<a href="'+product.href+'" title="View '+ product.desc+'">' + productContent + '</a>';		
		productContent += '<button class="btnremoveproduct" id="' + product.partNum 
						+ '" title="Remove from comparison" onclick="argos.product.comparison.browse.removeProductEvent(\'' 
						+ product.partNum + '\')"></button>';					 
		productContent = '<li id="compare' + product.partNum + '">' + productContent + '</li>';
		
		return productContent;
	},
	
	// render products stored in memory, ie, not the saved list
	render : function(pos) {	
		var comparison = argos.product.comparison;
		var browse = argos.product.comparison.browse;
	
		if (browse.STATUS.disabled === browse.config.status) return;
		if (browse.STATE.closed==browse.config.state || browse.STATE.hidden==browse.config.state) return;
		
		var content = "";		
		var	widget = $("#"+browse.WIDGET_ID)[0];
		var productList = comparison.productList;
		
		$(widget).find("h4 span").text(productList.length); // display number of selections
	
		if (productList && productList.length>0) {			
			for(var i=0; i<productList.length;i++) {
				var product = productList[i];
				if (product != null) {
					content += browse.generateProductHTML(i+1, product);
				}				
			}
			content = '<ul>' + content + '</ul>';
		} else {  // product list is empty
			content = '<strong>You curently have no items selected to compare.</strong>';
			content += '<span>If you would like to compare products, tick up to 10 items and select the compare button/link.</span>';
			content = '<div class="message">' + content + '</div>';
		}

		// update product list content
		var productPanel = $(widget).find("#products")[0];
		 $(productPanel).html(content);
	
		// visually disable compare all button if not enough products selected
		if (productList.length < browse.MIN_PRODUCTS_SIZE) {	
			$(widget).find("#btncompareall").hide();
			$(widget).find("#btnclearall").hide();
		}
		else {
			$(widget).find("#btncompareall").show();
			$(widget).find("#btnclearall").show()
		}
		
		//QC: 3829 - JB - 10/4/08			
		if (browse.STATE.minimised == browse.config.state) {
			//list of objects to hide
			$(productPanel).hide();		
			$(widget).find(".actions #clearallbutton").hide();	
			$(widget).find(".actions #compareallbutton").hide();
			
			//list of objects to show
			$(widget).find(".actions #showselected").show()
			
			//append minimised class to actions bar
			$(widget).find(".actions").addClass('minimised');
			
			//hover event for showselected
			$(widget).find(".actions #showselected").mouseover(function() {
				$(this).find("#btnshowselected").addClass('mouseover');
				}
			);
			
			$(widget).find(".actions #showselected").mouseout(function() {
				$(this).find("#btnshowselected").removeClass('mouseover');
				}
			);
						
			//set shadow height - equal to #comparisonlist
			$(widget).find(".shadow").height($(widget).height()  + "px");
			
			//switch sizing button
			$('#btnminmax').attr('class', 'btnmaximise');
			$('#btnminmax').attr('title', 'Maximise comparison list');
		} else {	
			$(productPanel).show();				
			
			//remove minimised class off actions bar
			$(widget).find(".actions").removeClass('minimised');
		
			//list of objects to hide
			$(widget).find(".actions #showselected").hide()
			
			//list of objects to show
			$(widget).find(".actions #clearallbutton").show();	
			$(widget).find(".actions #compareallbutton").show();
			$(widget).find(".comparelistwrapper").show();
			
			//switch sizing button
			$('#btnminmax').attr('class', 'btnminimise');
			$('#btnminmax').attr('title', 'Minimise comparison list');
			
			//set shadow height - equal to #comparisonlist
			$(widget).find(".shadow").height($(widget).height() + "px");
		} //end of QC 3829
		
		if (pos) argos.page.setPosition(widget, pos);
		
		$(widget).show();
		
		if (!$.browser.msie) $(widget).fadeTo(1, 1);
		$(widget).fadeIn(browse.TRANS_SPEED);
		$(widget).bgiframe({width: 316, height: 'auto'});		
	}, //end render()

	/** CONTENT RENDERING **/

	initHTML : function() {
		var browse = argos.product.comparison.browse;	
		
		browse.initWidget();
		browse.initViewLink();
		
		// Disabled for Rel67a
		//$('#comparisonlist').draggable({
			//handle : "h4"
		//}); 
	},
	
	initViewLink : function() {
		var browse = argos.product.comparison.browse;
		if (browse.STATUS.disabled !== browse.config.status) {
			$(".comparebar p").empty();		
			var viewLinkHTML = 'Tick up to '+ browse.MAX_PRODUCTS_SIZE +' items, then <button id="btnshowtop" class="btnshowlist btntop" title="Show my comparison list"><span>preview your selected items</span></button> <span class="additional">OR</span> <input type="image" src="' + imageDir + 'b_compare_selected_items.gif" class="compareselected" id="compareselectedtop" title="Click here to compare selected products" value=" " />';
			$(".comparebar p").html(viewLinkHTML);
			
			var viewLinkHTMLBase = 'Tick up to '+ browse.MAX_PRODUCTS_SIZE +' items, then <button id="btnshowbase" class="btnshowlist btnbase" title="Show my comparison list"><span>preview your selected items</span></button> <span class="additional">OR</span> <input type="image" src="' + imageDir + 'b_compare_selected_items.gif" class="compareselected btnbase" id="compareselectedbase"  title="Click here to compare selected products" value=" " />';
			$("#basecompare .comparebar p").html(viewLinkHTMLBase);
		} 
	},
	
	widgetPreviewCoords : function(location) {
		var browse = argos.product.comparison.browse;
		
		// using the #listerrhs container for default widget positioning, not the button to avoid IE shift problem
		var defaultPosParent = $("#headersort")[0];
	
		// get measures/co-ords relative to listerrhs
		var posY = argos.page.getPosition(defaultPosParent).y;
		
		var posX = $(defaultPosParent).width();
			
		if (location == "base") { // botton show list button
			posY = argos.page.getPosition($("#btnshowbase")[0]).y;
			
			// if widget is minimised, reduce negative y offset from base position
			if(browse.STATE.minimised == browse.config.state) {
				posY -= 181;
			} else if ($.browser.msie) { 
				posY -=440;
			} else if ($.browser.opera) { 	
				posY -=442;			
			} else if ($.browser.safari) { 
				posY -=444;
			} else {
				posY -=442;
			}
		}
		
		//QC: default position browser handling - 14/04/08		
		if ($.browser.msie) { 
				posX -= 128;
				posY += 82;
		} else if ($.browser.opera) { 	
				posX -= 128;
				posY += 83;			
		} else if ($.browser.safari) { 
				posX -= 128;
				posY += 104;
				$('#comparisonlist .shadow').height(325 + "px");	
		} else {
				posX -= 128;
				posY += 86;
		}
		
		browse.render({x: posX, y: posY});	
		
		if (location == "base") {
			// ensures base preview of widget is set on refresh/paging navigation
			window.location.href = "#"+browse.WIDGET_ID;		
		}
		
		//ensures that focus (& tab order) is set to run on the widget after load
		$("#"+browse.WIDGET_ID).focus();
			
	},
	
	galleryXCoords : function(x,compare) {
		var posX = x;
		
		if ($.browser.msie) { 
			posX -= 374;				
		} else if ($.browser.opera) { 	
			posX -= 374;				
		} else if ($.browser.safari) { 
			posX -= 374;	
		} else {
			posX -= 374;
		}
		
		// if the compare label has been clicked alter X
		if (compare) {
			posX += 54;
		}	
		
		return posX;
	
	},
	
	widgetPopupCoords : function(x,y) {
		var browse = argos.product.comparison.browse;
			
		var posY = y;
		var posX = x; 
		
		// popup coords browser handling	
		if ($.browser.msie) { 
			posY -= 20;
		} else if ($.browser.opera) { 	
			posY -= 22;				
		} else if ($.browser.safari) { 
			posY -= 3;
		} else {
			posY -= 21;
		}	
		
		
		browse.render({x: posX, y: posY});	
	},

	initWidget : function() {
		var widgetHTML	= '<div id="'+argos.product.comparison.browse.WIDGET_ID+'" >';
		widgetHTML		+= '<h4>You have selected <span>0</span> item(s) to compare</h4>';
		widgetHTML		+= '<button class="btnminimise" id="btnminmax" title="Minimise comparison list" />';
		widgetHTML		+= '<button class="btnclose" id="btnclose" title="Close comparison list" />';		
		widgetHTML		+= '<div class="comparelistwrapper">';
		widgetHTML		+= '<div id="products" class="droppable"></div>';
		widgetHTML		+= '<ul class="actions">';
		widgetHTML		+= '<li id="clearallbutton"><button id="btnclearall" title="Remove all comparison products"></button></li>';
		widgetHTML		+= '<li id="compareallbutton"><button id="btncompareall" title="Compare selected products"></button></li>';
		widgetHTML		+= '<li id="showselected"><button id="btnshowselected" title="Show selected item(s)" >Show selected item(s)</button></li>';
		widgetHTML		+= '</ul>';
		widgetHTML		+= '</div>';
		widgetHTML		+= '<div class="shadow"></div>';
		widgetHTML		+= '</div>';
		
		$("#content").before(widgetHTML);		
	},	

	saveConfig : function() {
		var browse = argos.product.comparison.browse;	// reduce namespace			
		argos.utils.persistence.persist(browse.CONFIG_NAME, browse.config);
	},	
	
	retrieveSavedConfig : function() {		
		var browse = argos.product.comparison.browse;
		return argos.utils.persistence.retrieve(browse.CONFIG_NAME);
	},
	
	restoreSavedConfig : function() {
		var browse = argos.product.comparison.browse;
		browse.config = browse.retrieveSavedConfig() || browse.config;
	}
}

$(document).ready(
	function() {
		argos.product.comparison.browse.init();
	}
);
