﻿
/*
		Nike Search Frontend
		Chris Thorwarth - 10/08
		
		11/18/09 - dale tan
			- fixed DOMParser issue check in IE
			
	*/
		
	var NIKESEARCH=new NikeSearch();
	
	function NikeSearch()
	{
		var self=this;
		this.pre_init=function()
		{
			if (JQ("div#nav>div#search").length > 0) JQ("div#nav>div#search").remove();
		};
		this.init=function()
		{
			self.config=self.merge_configs();
			//.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
			self.search_term=JQ.trim(decodeURIComponent(GetParam('srch'))).replace(/\"|!|'|@|#|$|%|&|~|`|^|\*|\||_/g,'').replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
			
			
			JQ('#'+self.config.container).append("<div id=\"nike_search_wrapper\" class=\"background\"><div id=\"nike_search_container\"></div></div>");
			self.container=JQ('#nike_search_container');
			self.container.addClass('nike_search_wrapper');
			
			self.check_environment();
			
			self.tunnel=new SearchTunnel();
			self.check_endecca();
			self.config_scene7();
			self.set_endecca_catalogs();
			self.set_translations();
			self.set_category_labels();
			self.results_manager=new SearchResultsManager(self);
			self.front_end=new SearchFrontEnd(self);
		};
		this.set_category_labels=function()
		{
			for(var i=0;i<self.config.sections.length;i++)
				self.config.sections[i].label=self.get_category_label(self.config.sections[i]);
		};
		this.get_category_label=function(section)
		{
			if(section.type=="endecca") return self.config.translations.products;
			if(typeof self.config.translations[section.id])	return self.config.translations[section.id];
			return section.id;
		};
		this.set_translations=function()
		{
			var language=location.href;
			language=language.substring(language.indexOf("/nikeos/p/")+10,language.length).split("/")[1].split("_")[0];
			switch(language)
			{
				case "de":		self.config.translations=
								{
									no_results:"Leider konnten wir keine Ergebnisse für diesen Suchbegriff finden.",
									overview:"\u00DCbersicht",
									loading:"loading",
									loading_results:"loading results",
									view_all:"Alle Ansehen",
									items:"Posten",
									did_you_mean:"Meintst Du:",
									products:"Produkte",
									general:"Artikel",
									training:"training",
									videos:"videos"
								};
								break;
				case "es":		self.config.translations=
								{
									no_results:"Lo siento, no se encontraron resultados para el t\u00E9rmino buscado.",
									overview:"Informaci\u00F3n general",
									loading:"loading",
									loading_results:"loading results",
									view_all:"Ver todo",
									items:"Piezas",
									did_you_mean:"Quiz\u00E1 quisiste decir:",
									products:"Productos",
									general:"Artículos",
									training:"training",
									videos:"videos"
								};
								break;
				case "fr":		self.config.translations=
								{
									no_results:"D\u00E9sol\u00E9s, nous n'avons pas de r\u00E9sultat pour votre recherche.",
									overview:"Aper\u00E7u",
									loading:"loading",
									loading_results:"loading results",
									view_all:"Voir tout",
									items:"Articles",
									did_you_mean:"Vouliez-vous d\u00E9crire:",
									products:"Produits",
									general:"Articles",
									training:"training",
									videos:"Vid\u00E9os"
								};
								break;
				case "it":		self.config.translations=
								{
									no_results:"Spiacenti, non abbiamo trovato alcun termine corrispondente alla tua ricerca. ",
									overview:"Panoramica generale ",
									loading:"loading",
									loading_results:"loading results",
									view_all:"Visualizza tutto",
									items:"Voci",
									did_you_mean:"Intendevi:",
									products:"Prodotti",
									general:"Articoli",
									training:"training",
									videos:"Video"
								};
								break;
				case "ja":		self.config.translations=
								{
									no_results:"\u7533\u3057\u8A33\u3042\u308A\u307E\u305B\u3093\u304C\u3001\u691C\u7D22\u306B\u30DE\u30C3\u30C1\u3059\u308B\u3082\u306E\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002",
									overview:"\u6982\u8981",
									loading:"loading",
									loading_results:"loading results",
									view_all:"\u3059\u3079\u3066\u3092\u898B\u308B",
									items:"\u30A2\u30A4\u30C6\u30E0",
									did_you_mean:"\u3082\u3057\u304B\u3057\u3066\uFF1A",
									products:"\u88FD\u54C1",
									general:"\u8AAD\u307F\u7269",
									training:"training",
									videos:"\u30D3\u30C7\u30AA"
								};
								break;
				case "ko":		self.config.translations=
								{
									no_results:"\uC8C4\uC1A1\uD569\uB2C8\uB2E4. \uAC80\uC0C9\uC5B4\uC640 \uC77C\uCE58\uD558\uB294 \uAC80\uC0C9\uACB0\uACFC\uAC00  \uC5C6\uC2B5\uB2C8\uB2E4.",
									overview:"\uAC1C\uC694",
									loading:"loading",
									loading_results:"loading results",
									view_all:"\uC804\uCCB4 \uBCF4\uAE30",
									items:"\uD56D\uBAA9",
									did_you_mean:"\uC774\uAC83\uC744 \uCC3E\uC73C\uC2ED\uB2C8\uAE4C:",
									products:"\uC81C\uD488",
									general:"\uCD5C\uC2E0\uB274\uC2A4",
									training:"training",
									videos:"\uBE44\uB514\uC624"
								};
								break;
				case "pt":		self.config.translations=
								{
									no_results:"Lamentamos, n\u00E3o foi encontrada nenhuma ocorr\u00EAncia para o termo pesquisado. ",
									overview:"Vis\u00E3o geral",
									loading:"loading",
									loading_results:"loading results",
									view_all:"Ver todos",
									items:"Itens",
									did_you_mean:"Voc\u00EA quis dizer:",
									products:"Produtos",
									general:"Artigos",
									training:"training",
									videos:"Vídeos"
								};
								break;
				case "th":		self.config.translations=
								{
									no_results:"\u0E02\u0E2D\u0E2D\u0E20\u0E31\u0E22 \u0E40\u0E23\u0E32\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E04\u0E33\u0E17\u0E35\u0E48\u0E04\u0E38\u0E13\u0E04\u0E49\u0E19\u0E2B\u0E32",
									overview:"\u0E20\u0E32\u0E1E\u0E23\u0E27\u0E21",
									loading:"loading",
									loading_results:"loading results",
									view_all:"\u0E14\u0E39\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",
									items:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23",
									did_you_mean:"\u0E04\u0E38\u0E13\u0E2B\u0E21\u0E32\u0E22\u0E04\u0E27\u0E32\u0E21\u0E27\u0E48\u0E32 :",
									products:"\u0E2A\u0E34\u0E19\u0E04\u0E49\u0E32",
									general:"\u0E1A\u0E17\u0E04\u0E27\u0E32\u0E21",
									training:"training",
									videos:"\u0E27\u0E35\u0E14\u0E34\u0E17\u0E31\u0E28\u0E19\u0E4C"
								};
								break;
				case "zh":		self.config.translations=
								{
									no_results:"\u5C0D\u4E0D\u8D77\uFF0C\u6C92\u6709\u627E\u5230\u7B26\u5408\u60A8\u8981\u6C42\u7684\u9805\u76EE\u3002",
									overview:"\u7E3D\u89BD",
									loading:"loading",
									loading_results:"loading results",
									view_all:"\u67E5\u770B\u5168\u90E8",
									items:"\u9805\u76EE",
									did_you_mean:"\u4F60\u7684\u610F\u601D\u662F\uFF1A",
									products:"\u7522\u54C1",
									general:"\u5546\u54C1",
									training:"training",
									videos:"\u5F71\u7247"
								};
								break;
				default:		self.config.translations=
								{
									no_results:"Sorry, we found no matches for your search term.",
									overview:"Overview",
									loading:"loading",
									loading_results:"loading results",
									view_all:"View All",
									items:"Items",
									did_you_mean:"Did you mean",
									products:"products",
									general:"articles",
									training:"training",
									videos:"videos"
								};
								break;
			}
			self.config.translations.challenges="Challenges";
		};
		this.config_scene7=function()
		{
			if(self.commerce_mode==2 || self.commerce_mode==3) self.scene7="http://images.nike.com/is/image/emea/";
			else self.scene7="http://images.nike.com/is/image/DotCom/";
		};
		this.check_environment=function()
		{
			if(location.host.match(/env1-brand/i) || location.host.match(/ecn\d+-/i)) self.environment='tie';
			else if(location.host.match(/nike\.com/i)) self.environment='prod';
			else self.environment='dev';
		};
		this.check_endecca=function()
		{
		
			//add f4a tunnel only if necessary
			var endecca=false;
			
			for(var i=0;i<self.config.sections.length;i++)
			{
				if(self.config.sections[i].type=='endecca') endecca=true;
			}
			if(endecca)
			{
				self.commerce_mode=0;
				if(typeof nike_commerce == "undefined" || typeof nike_commerce.commerce_mode == "undefined" || nike_commerce.commerce_mode==0)
				{
					self.config.sections=JQ.grep(self.config.sections,function(n,i)
					{
						return (n.type!="endecca");
					});
					return;
				}
				self.commerce_mode=nike_commerce.commerce_mode;
				self.endecca_config={country:nike_commerce.params.country,lang_locale:nike_commerce.params.lang_locale};

				var baseURL;
				//determine base url:
				(self.environment=='prod')?	baseURL="http://search1.nike.com/":baseURL="http://qa-search.nike.com/";
				if(typeof site_data!='undefined' && typeof site_data.settings!='undefined' && typeof site_data.settings.search_service!='undefined')
					baseURL=site_data.settings.search_service.split('/',3).join('/')+'/';
				
				(self.commerce_mode==1)?baseURL+="onestore/nikestore/search.xml":baseURL+="onestore/emea/search.xml";

				self.endecca_config.baseURL=baseURL;
				self.endecca_tunnel=new EndeccaTunnel(self);
				JQ('body').append("<div id=\"endecca_floater\" class=\"background\" ></div>");
				self.floater=JQ('body').find('#endecca_floater');
				self.floater.hover(function(){},function()
				{
					JQ(this).hide();
				});
			}
		};
		this.merge_configs=function()
		{
			var config=
			{
				container:"nikesearch",
				cropped_thumbnails:false,
				images:
				{
					top_bg:"/nikeos/site/search/global/templates/images/bg_header.jpg",
					text_input_bg:"/nikeos/site/search/global/templates/images/bg_search.gif",
					tab_bg:"/nikeos/site/search/global/templates/images/bg_tabnav.jpg",
					paging_left:"/nikeos/site/search/global/templates/images/page_left.gif",
					paging_right:"/nikeos/site/search/global/templates/images/page_right.gif",
					view_all_rt_arrow:"/nikeos/site/search/global/templates/images/indicator_arrow.gif"
				},
				sections:[],
				overview:'AUTO',
				overview_config:
				{
					grid:{per_page:8},
					list:{per_page:5},
					endecca:{per_page:8}
				},
				tabs:'AUTO',
				search_base:"/nikeos/site/search/global/results.jsp?",
				category:"nsw",
				translations:{},
				lang_locale:"en_US",
				country:"US",
				commerce_mode:"US",
				PDP_Page:"commerce?p=PDP&pid=%PROD_ID%&pgid=%PROD_GROUP_ID%&cid=%CATALOG_ID%",
				PDP_NIKEID_Page:"commerce?p=PDPiD&pid=%PROD_ID%&pgid=%PROD_GROUP_ID%&cid=%CATALOG_ID%",
				default_thumbnail:"/nikeos/global/image/search_default_thumb.jpg"
			};
			var merged_config={};
			if(typeof NIKE_SEARCH_CONFIG != 'undefined')		
			{
				//for(var p in NIKE_SEARCH_CONFIG)
				//	config[p]=NIKE_SEARCH_CONFIG[p];
				merged_config=JQ.extend(true,{},config,NIKE_SEARCH_CONFIG);
			}

			if(typeof nike_commerce != 'undefined')
			{
				merged_config.lang_locale=nike_commerce.params.lang_locale;
				merged_config.country=nike_commerce.params.country;
			}

			//-- get total sections:
			var i=0;
			for(var p=0;p<merged_config.sections.length;p++)
			{
				if(!merged_config.sections[p].per_page)
					merged_config.sections[p].per_page=10;
				i++;
			}
			
			merged_config.locale=location.href.substring(location.href.indexOf("/nikeos/p/")+10,location.href.length).split("/")[1];
			merged_config.thumbnail_site=location.href.substring(location.href.indexOf("/nikeos/p/")+10,location.href.length).split("/")[0];


			merged_config.total_sections=i;
			return merged_config;
		};
		this.set_endecca_catalogs=function()
		{
			for(var i=0;i<self.config.sections.length;i++)
			{
				if(self.config.sections[i].type=="endecca")
				{
					if(self.commerce_mode==2 || self.commerce_mode==3)
						self.config.sections[i].catalog=self.config.sections[i].EMEA_Catalog;
					else
						self.config.sections[i].catalog=self.config.sections[i].US_Catalog;
				}
			}
		};
		self.pre_init();
		JQ(self.init);
	}
	
	function SearchResultsManager(parent)
	{
		var self=this;
		this.init=function()
		{
			self.results={};
			self.load_results();
		};
		this.load=function(url,callback)
		{
			if(	typeof self.results[url]!='undefined' )
				callback(self.results[url],url);
			else
				parent.tunnel.issue(url,function(data,url)
				{
					self.parse_results(data,url);
					callback(self.results[url],url);
				});	
		};
		this.endecca_load=function(url,callback)
		{
			if(	typeof self.results[url]!='undefined'	)
				callback(self.results[url],url);
			else
			{
				parent.endecca_tunnel.add(
				{
					url:url,
					callback:function(data)
					{
						self.parse_endecca_results(data,url);
						callback(self.results[url],url);
					}
				});
			}
		};
		this.load_results=function()
		{
			var url;
			var sections=parent.config.sections;
			self.to_load=[];
			for(var p=0;p<sections.length;p++)
			{
				if(sections[p].type!='endecca')
				{
					url=self.build_url({section:sections[p].id,per_page:sections[p].per_page});
					self.to_load[self.to_load.length]=url;
					self.load(url,self.loaded_results);
				}
				else
				{
					url=self.build_endecca_url(
					{
						page:1,
						per_page:sections[p].per_page,
						catalog:sections[p].catalog
					});
					self.to_load[self.to_load.length]=url;
					self.endecca_load(url,self.loaded_results);
				}
			}
		};
		this.build_endecca_url=function(config)
		{
			var url=parent.endecca_config.baseURL+"?";
			url+="Ntt="+encodeURIComponent(parent.search_term)+"&";
			url+="pageNum="+config.page+"&";
			url+="pageMode="+config.per_page+"&";
			url+="isInStockOnly=true&";
			url+="returnType=records&";
			url+="catalogs="+config.catalog+"&";
			url+="lang_locale="+parent.endecca_config.lang_locale+"&";
			url+="country="+parent.endecca_config.country;
			return url;
		};
		this.loaded_results=function(data,url)
		{
			self.launch_front_end();
		};
		self.make_xml=function(data)
		{
			var xml_doc;

			if(window.DOMParser)
			{
				xml_doc=(new DOMParser()).parseFromString(data, "text/xml");
			}
			else
			{
				xml_doc=new ActiveXObject("Microsoft.XMLDOM");
				xml_doc.async="false";
				xml_doc.loadXML(data);
			}

			var xml=JQ(	xml_doc	);
			return xml;
		};
		self.parse_results=function(data,url)
		{
			xml_text=data.replace(/opensearch:/g,"");
			var xml=self.make_xml(xml_text);

			if(typeof self.results[url]=="undefined")
				self.results[url]={};
				
			self.results[url].totalResults=parseInt(xml.find('channel>totalResults').text(),10);
			self.results[url].suggestedQuery=xml.find('channel>suggestedQuery').text();
			self.results[url].startIndex=parseInt(xml.find('channel>startIndex').text(),10);
			self.results[url].items=[];
			
			var item;
			xml.find('item').each(function()
			{
				item={};
				item.title=JQ(this).find('title').text();
				item.section=JQ(this).find('section').text();									
				item.link=JQ(this).find('link').text();
				item.price=JQ(this).find('price').text();
				item.thumbnail=JQ(this).find('thumbnail').text();
				item.description=JQ(this).find('description').text();

				self.results[url].items[self.results[url].items.length]=item;
			});
		};
		self.parse_endecca_results=function(data,url)
		{
			var xml=JQ(data);
			if(typeof self.results[url]=="undefined")
				self.results[url]={};
			//console.log(xml);
			self.results[url].totalResults=parseInt(xml.find('totalRecords').text(),10);
			self.results[url].page=parseInt(xml.find('currentPageNum').text(),10);
			self.results[url].items=[];
			
			var catalog_id=null;
			if(nike_commerce.commerce_mode==1)
				catalog_id=NIKE_COMMERCE_CONFIG.US_Catalog;
			else
				catalog_id=NIKE_COMMERCE_CONFIG.EMEA_Catalog;
				
			var item;
			xml.find('products>productGroup>product').each(function()
			{
				item={};
				item.id=JQ(this).attr('id');
				item.price=JQ(this).find('formattedListPrice').text();
				item.color=JQ(this).find('colorDescription').text();
				item.title=JQ(this).find('displayName').text();	
				item.colorNumber=JQ(this).find('colorNumber').text();
				item.styleNumber=JQ(this).find('styleNumber').text();
				
				item.prodGroupId=JQ(this).find('prdGroupId').text();
				
				//construct thumbnail url here:
				item.thumbnail=parent.scene7+item.styleNumber+"_"+item.colorNumber+"_"+"A"+"?wid=174&hei=212&fmt=png&qlt=90,0&resMode=sharp&op_usm=0.5,0.3,0,0&defaultImage=/DotCom/SEARCH_002_A";
				item.link=parent.config.PDP_Page.replace("%PROD_ID%",item.id).replace("%PROD_GROUP_ID%",item.prodGroupId).replace("%CATALOG_ID%",catalog_id);
								
				//determing if nikeid or not
				item.nike_id=false;
				if(	JQ(this).find('nikeType').text()=="NIKEID"	)
				{
					item.nike_id=true;
					item.link=parent.config.PDP_NIKEID_Page.replace("%PROD_ID%",item.id).replace("%PROD_GROUP_ID%",item.prodGroupId).replace("%CATALOG_ID%",catalog_id);
					item.thumbnail="http://ugc.nikeid.com/is/image/nike/ugc/"+JQ(this).find('prebuildId').text();
					if(item.thumbnail.indexOf(".tif")==-1)
						item.thumbnail+=".tif";	
					item.thumbnail+="?wid=144&hei=212&fmt=png&qlt=90,0";
					item.path = JQ(this).find('pathName').text();
					item.piid = JQ(this).find('productInstanceId').text();
					item.pbid = JQ(this).find('prebuildId').text();
					item.bv=JQ(this).find('BUILDER_VERSION').text();
				}
				
				self.results[url].items[self.results[url].items.length]=item;
			});
		};
		self.launch_front_end=function()
		{
			for(var i=0;i<self.to_load.length;i++)
			{
				if(typeof self.results[self.to_load[i]]=='undefined')
					return;
			}
			parent.front_end.loaded();
		};
		this.build_url=function(config)
		{
			if(!config.section)
				return;
			var default_config=
			{
				locale:parent.config.locale,
				category:parent.config.category,
				startIndex:0,
				pageIndex:'',
				itemsPerPage:config.per_page
			};
			
			for(var p in config)
				default_config[p]=config[p];
			//%2Bsection%3Ageneral+AND+test+%2Bcategory%3Answ
			var url=parent.config.search_base+"query=%2Bsection%3A"+default_config.section+"+AND+%2B%28"+encodeURIComponent(parent.search_term)+"%29+%2Bcategory%3A"+default_config.category;
			
			url+="&locale="+default_config.locale;
			url+="&startIndex="+default_config.startIndex;
			url+="&pageIndex="+default_config.pageIndex;
			url+="&itemsPerPage="+default_config.itemsPerPage;
			
			return url;
		};
		self.get_page=function(section,page,per_page,callback)
		{
			if(section.type=='endecca')
			{
				var url=self.build_endecca_url(
				{
					page:page,
					per_page:per_page,
					catalog:section.catalog
				});
				self.endecca_load(url,function(data,url)
				{
					callback(self.results[url]);
				});
			}
			else
			{
				startIndex=(page-1)*per_page;
				var url=self.build_url({	section:section.id,per_page:per_page,startIndex:startIndex		});
				self.load(url,function(data,url)
				{
					callback(self.results[url]);
				});
			}
		};
		self.init();
	}

	function SearchFrontEnd(parent)
	{
		var self=this;
		this.init=function()
		{
			self.parent=parent;
			self.container=parent.container;
			self.draw_form();

			self.container.append("<div id=\"search_content\"></div>");
			self.content=self.container.find('#search_content');	
						
			self.tab_content={};
		};
		self.loaded=function()
		{
			self.container.find('#loading_results').hide();
			self.container.find('#search_content').css('visibility','visible');
			self.tabs=new SearchTabs(self);
			self.tabs.render();
			
			//trigger click event to open first tab
			self.tabs.container.find('.tab:first').click();

			//--hide tabs is only 1 tab exists:
			if(	parent.config.tabs!=true && parent.config.total_sections<=1)
				self.tabs.container.hide();
		};
		self.draw_form=function()
		{
			var str="";
			str+="<div id=\"search_top\" style=\"background:url("+parent.config.images.top_bg+") repeat-x top left;\" >";
			str+="	<div id=\"search_form\" style=\"background:url("+parent.config.images.text_input_bg+") no-repeat left top;\" >";
			str+="		<input id=\"search_text\" value=\""+decodeURIComponent(parent.search_term).replace(/(\\)([-[\]{}()*+?.,\\^$|#\s])/g,"$2")+"\" class=\"input_color\" type=\"text\" maxlength=\"65\" />";
			str+="		<img id=\"search_submit\" src=\"/nikeos/site/search/global/templates/images/null_1x1.gif\" />";
			str+="	</div>";
			str+="</div>";
			str+="<div id=\"loading_results\" >"+parent.config.translations.loading_results+"</div>";
			self.container.append(	JQ(str)	);
			
			self.container.find('img#search_submit').click(self.do_search);
			self.container.find('input#search_text').keydown(function(e){if(e.which==13)self.do_search();});
		};
		this.do_search=function()
		{
			var term=JQ.trim(self.container.find('input#search_text').val());
			//console.log(term);
			var url=encodeURIComponent(term);
			//console.log(url);
			tracking.click({pageName:track_site+">search_results>search",prop17:"search",prop18:"search",events:'event2,event13'});
			if(term.length > 0) location.href="?srch="+url;
		};
		this.open_tab=function(id)
		{
			self.tabs.open_tab(id);
			self.open_content(id);
		};
		this.open_content=function(id)
		{
			if(	self.content.find('#content_'+id).hasClass('active')	)
				return;
			self.content.find('.results_content').each(function()
			{
				var i_id=JQ(this).attr('id').replace('content_','');
				if(i_id==id)
					self.tab_content[i_id].show();
				else
					self.tab_content[i_id].hide();
			});
		};
		this.new_tab_content=function(section)
		{
			self.tab_content[section.id]=new ResultsObject(section, self);
		};
		this.scrollToTop=function()
		{
			JQ('html, body').animate({ scrollTop: JQ('div#search_tabs').offset().top }, 'slow');
			if (parent.floater) parent.floater.hide();
		};
		self.init();
	}
	
	function SearchTabs(parent)
	{
		var self=this;
		this.init=function()
		{
			parent.container.find('#search_content').prepend("<div id=\"search_tabs\" style=\"background:url("+parent.parent.config.images.tab_bg+") repeat-x left top;\" ></div><div class=\"under_tabs\"></div><div class=\"bold_msg\" id=\"did_you_mean\" ></div>");
			self.container=parent.container.find('#search_tabs');
			
			var sections=parent.parent.config.sections;			
			if(parent.parent.config.overview==true || (parent.parent.config.overview=='AUTO' && parent.parent.config.total_sections>1))
				self.add_tab({label:parent.parent.config.translations.overview,id:'overview',type:'overview'});

			for(var p=0;p<sections.length;p++)
				self.add_tab(	sections[p]	);
		};
		this.render=function()
		{
			if(parent.parent.config.overview==true || (parent.parent.config.overview=='AUTO' && parent.parent.config.total_sections>1))
				parent.new_tab_content({label:parent.parent.config.translations.overview,id:'overview',type:'overview'});
				
			for(var p=0;p<parent.parent.config.sections.length;p++)
				parent.new_tab_content(	parent.parent.config.sections[p]	);
		};
		this.add_tab=function(section)
		{
			//var str="<div class=\"tab tab_inactive\" id=\"tab_"+section.id+"\" ><div class=\"tab_inner\" ><a class=\"label inactive_color\" href=\"javascript:;\">"+section.label+"</a> <a href=\"javascript:;\" class=\"total active_color\" ></a><div class=\"clearme\"></div></div></div>";
			var str= "";
			str+="<div class=\"tab tab_inactive\" id=\"tab_"+section.id+"\" >";
			str+="	<a class=\"label inactive_color\" href=\"javascript:;\">"+section.label+"</a>";
			str+="	<a href=\"javascript:;\" class=\"total active_color\" >&nbsp;</a>";
			str+="	<div class=\"clearme\"></div>";
			str+="</div>";
			self.container.append(str);
			self.container.find('.tab:last').each(function()
			{
				JQ(this).click(function(){	parent.open_tab(	JQ(this).attr('id').replace('tab_','')	);	});
			});
		};
		this.set_total=function(id,total)
		{
			self.container.find('#tab_'+id+' .total').html('('+total+')');
		};
		this.get_total=function(id)
		{
			var total=parseInt(self.container.find('#tab_'+id+' .total').html().replace("(","").replace(")",""),10);
			if(isNaN(total))
				return 0;
			return total;
		};
		this.open_tab=function(id)
		{
			if(id!='overview')
				tracking.click({pageName:track_site+">search_results>"+id,prop17:"search_results",prop18:"search_results"});
			var this_tab=self.container.find('.tab#tab_'+id);
			if(	this_tab.hasClass('active'))
				return;
			
			self.container.find('.tab.active a.label').removeClass('active_color').addClass('inactive_color');
			self.container.find('.tab.active').removeClass('active').addClass('tab_inactive');
			
			this_tab.removeClass('tab_inactive').addClass('active background');
			this_tab.find('a.label').addClass('active_color').removeClass('inactive_color');
		};
		
		this.init();
	}
	
	function SearchTunnel()
	{
		var self=this;
		this.init=function()
		{
			self.requests=[];
			self.request_running=false;
		};
		this.issue=function(url, callback)
		{
			self.requests[self.requests.length]={u:url,d:{},c:callback};
			if(!self.request_running)
			{
				self.request_running=true;
				self.run_requests();
			}
		};
		self.run_requests=function()
		{
			if(self.requests.length==0)
			{
				self.request_running=false;
				return;
			}
			JQ.get(self.requests[0].u, self.requests[0].d, self.issue_done, "text");
		};
		this.issue_done=function(data)
		{
			self.requests[0].c(data,self.requests[0].u);
			self.requests.shift();
		
			if(self.requests.length==0) self.request_running=false;
			else self.run_requests();
		};
		self.init();
	}
	
	function EndeccaTunnel(parent)
	{
		var self=this;
		this.init=function()
		{
			self.build_flash();
			self.requests=[];
			self.isRunning=false;
			self.loaded=false;
			
			var intervalKey=window.setInterval(function()
			{
				if(self.f4a.checkFlash())
				{
					self.loaded=true;
					self.run();
					window.clearInterval(intervalKey);
				}
			},50);
		};
		this.build_flash=function()
		{
			var el_id='f4a_nike';
			var f4a_id='f4a_nike';
			self.f4a=new f4a_js_flash({'id':f4a_id,'swfname':'f4a.swf','swfuri':'/nikeos/global/swf/f4a/f4a.swf'});
			
			var e=document.createElement("div");
			e.id=el_id+'flashcontent';
			e.style.width='1px';
			e.style.height='1px';
			e.style.position='absolute';
			e.style.top='-1000px';
			document.getElementsByTagName('body').item(0).appendChild(e);
			self.f4a.createSwfObject();
		};
		this.add=function(obj)
		{
			self.requests[self.requests.length]=obj;
			if(!self.isRunning && self.loaded)
			{
				self.isRunning=true;
				self.run();
			}
		};
		this.run=function()
		{
			if(self.requests.length==0)
			{
				self.isRunning=false;
				return;
			}
			self.issue(self.requests[0]);
		};
		this.issue=function(obj)
		{
			var default_req=
			{
				onready:self.response,
				meth:'GET',
				data:{}				
			};
			for(var p in obj)
			{
				if(p!='callback') default_req[p]=obj[p];
			}
			if(default_req.url.indexOf("?")>-1)default_req.url+="&";
			else default_req.url+="?";
			
			default_req.url+="cb="+(new Date).valueOf();	
			self.f4a.open(default_req);
		};
		this.response=function(data)
		{
			data=data.replace(/&amp;/g,'&').replace(/&/g,'&amp;');
			if(window.DOMParser)
			{
				var dp=new DOMParser();
				var xml=dp.parseFromString(data,'text/xml');
				//console.log(xml);
			}
			else
			{
				var xml=new ActiveXObject('Microsoft.XMLDOM');
				xml.async='false';
				xml.loadXML(data);
			}
			if (!self.requests[0]) return;
			var callback=self.requests[0].callback;
			self.requests.shift();
			self.run();
			callback(	xml	);
		};
		self.init();
	}	
	
	function ResultsObject(section,parent)
	{
		var self=this;
		this.init=function()
		{
			parent.content.append("<div id=\"content_"+section.id+"\" class=\"results_content\" >"+section.label+"</div>");
			self.container=parent.container.find('#content_'+section.id);
			self.parent=parent;
			self.id=section.id;
			self.label=section.label;
			self.type=section.type;
			self.page=1;
			self.per_page=section.per_page;
			self.tunnel=parent.parent.tunnel;
			self.total=false;
			
			if(section.type=='overview')
				return self.render_overview();

			self.top_paging=new SearchPaging(self.per_page,self,"TOP");
			self.bottom_paging=new SearchPaging(self.per_page,self,"BOTTOM");
			self.render_page(self.page);
		};
		this.show=function(){ self.container.addClass('active'); };
		this.hide=function(){ self.container.removeClass('active'); };
		self.render_page=function(page)
		{
			self.page=page;
			self.top_paging.set_page(page);
			self.bottom_paging.set_page(page);
			self.container.find('.loading').show();
			self.loading=true;
			
			parent.parent.results_manager.get_page(section,self.page,self.per_page,function(data)
			{
				self.render_section(section.type,data);
			});
		};
		self.render_section=function(type,data,target,per_page)
		{
			var overview=false;
			if(target && target.attr('id').indexOf('overview_') != -1)
				overview=true;
			
			if(!self.total)
			{
				self.total=data.totalResults;
				if(self.id!='overview')
				{
					self.render_wrapper();
					self.top_paging.set_total(self.total);
					self.top_paging.render();
					self.bottom_paging.set_total(self.total);
					self.bottom_paging.render();

					//set total in tab
					parent.tabs.set_total(self.id,self.total);
					
					if(	data.suggestedQuery && data.suggestedQuery.length>0	)
					{
						var entry=data.suggestedQuery.replace('+','').replace('(','').replace(')','').replace('"','');
						var url=encodeURI(entry);
						JQ('div#did_you_mean').html(parent.parent.config.translations.did_you_mean+" <a class=\"active_color\" href=\"?srch="+url+"\">"+entry+"</a> ?").show();
					}
				}
			}
			self.container.find('.loading').hide();
			self.loading=false;
			
			if(self.id!='overview')
			{
				self.top_paging.show();
				self.bottom_paging.show();
			}
			
			if(data.totalResults==0)
			{
				if(overview)
					target.parent().find('div.view_all').hide();
				return self.render_empty(target);
			}

			var str="";
			if(!per_page)
				per_page=data.items.length;
				
			for(var i=0;i<data.items.length && i<per_page;i++)
			{
				if(type=='list') str+=self.render_list_result(data.items[i],i,target);
				else if(type=='grid') str+=self.render_grid_result(data.items[i],i);
				else if(type=='endecca') str+=self.render_endecca_result(data.items[i],i);
			}
			var content;
			if(!target)
			{
				self.content.html(str);
				content=self.content;
			}
			else
			{
				target.html(str);
				content=target;
			}
				
			content.find('.endecca_result').each(function()
			{
				var url=JQ(this).attr('rel');
				JQ(this).click(function()
				{
					location.href=url;
				});
				JQ(this).hover(function()
				{
					var floater=parent.parent.floater;
					if(JQ(this).hasClass('nike_id'))
						floater.addClass('nike_id');
					else
						floater.removeClass('nike_id');
					
					floater.css(
					{
						top:JQ(this).offset().top-10,
						left:JQ(this).offset().left-10,
						height:JQ(this).height()+20,
						width:JQ(this).width()+20
					}).html(JQ(this).html()).show();
					floater.click(function()
					{
						location.href=url;
					});
				},
				function()
				{});
			});
			
			content.find('div.thumbnail_wrapper').click(function()
			{
				location.href=JQ(this).attr('rel');
			});
		};
		self.render_list_result=function(item,i,target)
		{
			var max=200;
			if(target&&target.attr('id').indexOf('overview_')!=-1)
				max=80;
			var str="";
			str+="<div class=\"list_result border\" >";
			str+="	<div class=\"list_result_inside\" >";
			
			if(parent.parent.config.cropped_thumbnails)
			{
				str+="<div class=\"thumbnail_wrapper border\" style=\"background:url("+parent.parent.config.default_thumbnail+") no-repeat top left;\" rel=\""+item.link+"\" >";
				if(item.thumbnail.length>10)
					str+="<div class=\"thumbnail_inner\" style=\"background:url("+self.buildThumbnailURL(item.thumbnail)+") no-repeat top left;\" ></div>";
				str+="</div>";
			}
			else if(item.thumbnail.length>10)
			{
				str+="<div class=\"thumbnail\"><a href=\""+item.link+"\"><img src=\""+item.thumbnail+"\" /></a></div>";
			}
			else
			{
				str+="<div class=\"thumbnail\"><a href=\""+item.link+"\"><img src=\""+parent.parent.config.default_thumbnail+"\" /></a></div>";
			}
			
			str+="	<div class=\"detail\">";
			str+="		<div class=\"title\"><a href=\""+item.link+"\" class=\"result_title\">"+item.title+"</a></div>";
			if(item.description.length>10)
				str+="<div class=\"description\"><a href=\""+item.link+"\" class=\"description_color\" >"+self.make_desc(item.description,max)+"</a></div>";
			str+="	</div>";
			str+="	</div>";
			str+="</div>";
			return str;
		};
		self.buildThumbnailURL=function(thumbnail)
		{
			if(thumbnail.indexOf("?")>-1)
				thumbnail=thumbnail.substring(0,thumbnail.indexOf("?"));

			thumbnail=str_replace("http://www.nike.com/","",thumbnail);
			thumbnail=str_replace("http://inside.nike.com/","",thumbnail);
			thumbnail=str_replace("http://nikeos.edgeboss.net/","",thumbnail);
			thumbnail=str_replace("http://","",thumbnail);
			thumbnail=str_replace("?","_",thumbnail);
			thumbnail=str_replace(",","_",thumbnail);
			thumbnail=str_replace("'","_",thumbnail);
			thumbnail=str_replace("\"","_",thumbnail);
			thumbnail=str_replace(" ","_",thumbnail);
			thumbnail=str_replace("/","_",thumbnail);
			thumbnail=str_replace("&","_",thumbnail);
			thumbnail=str_replace("=","_",thumbnail);
			thumbnail=str_replace("-","_",thumbnail);
			thumbnail=str_replace(".png","",thumbnail);
			thumbnail=str_replace(".jpeg","",thumbnail);
			thumbnail=str_replace(".jpg","",thumbnail);
			thumbnail=str_replace(".gif","",thumbnail);
			thumbnail+=".jpg";
			
			var length=thumbnail.length;
			if(length>63)
				thumbnail=thumbnail.substring((length-63),length);
			
			//var site=location.href;
			//site=site.substring(site.indexOf("/nikeos/p/"),site.length).split("/")[3];
			var site=parent.parent.config.thumbnail_site;
			
			return "http://plusmedia.nike.com/nikeos/thumbnails/"+site+"/"+thumbnail;	
			//return "http://inside.nikesportswear.com/thumbnail_manager/images/thumbnails/"+site+"/"+thumbnail;	
		};
		self.make_desc=function(str,len)
		{
			var str=limit_string(str,len);
			var terms=parent.parent.search_term.split(" ");
			for(var i=0;i<terms.length;i++)
				str=str.replace(terms[i],"<span>"+terms[i]+"</span>").replace(terms[i].toUpperCase(),"<span>"+terms[i].toUpperCase()+"</span>").replace(terms[i].ucfirst(),"<span>"+terms[i].ucfirst()+"</span>");
			return str;
		};
		self.render_grid_result=function(item,i)
		{
			var str="";
			str+="<div class=\"grid_result border";			
			if((i+1)%4!=0) str+=" side_border";
					
			str+="\" >";
			str+="	<div class=\"grid_result_inner\" >";
			str+="		<div class=\"title\"><a href=\""+item.link+"\" class=\"result_title\" >"+item.title+"</a></div>";
			str+="		<div class=\"thumbnail\"><a href=\""+item.link+"\"><img src=\""+item.thumbnail+"\" /></a></div>";
			str+="	</div>";
			str+="</div>";
			return str;
		};
		self.render_endecca_result=function(item,i)
		{
			//console.log(item);
			var str="";
			if (item.nike_id)
				item.link += '&path=' + item.path + '&piid=' + item.piid + '&pbid=' + item.pbid + '&bv=' + item.bv;
			str+="<div rel=\""+item.link+"\" class=\"grid_result border endecca_result";			
			if(	(i+1)%4!=0) str+=" side_border";
			
			if(item.nike_id) str+=" nike_id";

			str+="\" >";
			str+="	<div class=\"grid_result_inner\" >";
			str+="		<div class=\"title\">";
			str+="			<div class=\"result_title\" >"+item.title+"</div>";
			str+="			<div class=\"result_price\">"+item.price+"</div>";
			str+="		</div>";
			str+="		<div class=\"thumbnail\"><img src=\""+item.thumbnail+"\" /></div>";
			str+="	</div>";
			str+="</div>";
			return str;
		};
		self.render_wrapper=function()
		{
			var str="";
				str+="<div class=\"results_section_wrapper border\">";
				str+="	<div class=\"results_section_header section_header \">";
				str+="		<div class=\"title\">"+self.label+"</div>";
				str+="		<div class=\"top_paging paging\"></div>";
				str+="		<div class=\"loading\">"+parent.parent.config.translations.loading+"</div>";				
				str+="	</div>";
				str+="	<div class=\"results_section_content\"></div>";
				str+="	<div class=\"results_section_footer section_footer\">";
				str+="		<div class=\"title\">"+self.label+"</div>";
				str+="		<div class=\"bot_paging paging\"></div>";
				str+="		<div class=\"loading\">"+parent.parent.config.translations.loading+"</div>";				
				str+="	</div>";
				str+="</div>";
			self.container.html(str);
			self.content=self.container.find('.results_section_content');	
		};
		self.render_empty=function(target)
		{
			var str="<div id=\"no_results\" class=\"msg bold_msg\">"+parent.parent.config.translations.no_results+"</div>";
			if(target) target.html(str);
			if(self.content) self.content.html(str);
			//else
			//	self.container.html(str);
		};
		self.render_overview=function()
		{
			var section,max;
			self.overview_sections={};
			self.container.empty();
			for(var p=0;p<parent.parent.config.sections.length;p++)
			{
				section=parent.parent.config.sections[p];
				self.draw_overview_wrapper(section);
				parent.parent.results_manager.get_page(section,1,section.per_page,function(data)
				{
					max=parent.parent.config.overview_config[section.type].per_page;
					if(data.totalResults>0)
						self.render_section(section.type,data, self.container.find('div#overview_'+section.id), max );
					else
					{
						self.container.find('div#overview_'+section.id).parent().hide();
						parent.container.find('div#tab_'+section.id).hide();
					}
					parent.tabs.set_total('overview', parent.tabs.get_total('overview')+data.totalResults);
				});
			}
			
			if(parent.tabs.get_total('overview')==0)
			{
				tracking.click({pageName:track_site+">search_results_null",prop11:parent.parent.search_term,eVar11:parent.parent.search_term,prop10:parent.parent.search_term,prop17:"search_results_null",prop18:"search_results_null"});
				JQ('div#search_tabs').hide();
				self.container.html("<div id=\"loading_results\">"+parent.parent.config.translations.no_results+"</div>");
			}
			else
				tracking.click({pageName:track_site+">search_results",prop11:parent.parent.search_term,eVar11:parent.parent.search_term,prop17:"search_results",prop18:"search_results"});

			var sub_sections=self.container.find('.half');
			for(var i=0;i<sub_sections.length;i++)
			{
				if(i%2!=0)
					JQ(sub_sections[i]).addClass('right');
			}
			self.container.append("<div class=\"bottom_cleanup\" ><div></div></div>");
		};
		self.draw_overview_wrapper=function(section)
		{
			var str="";
			if(section.type=="list")
				str+="<div class=\"results_section_wrapper overview border half\">";
			else
				str+="<div class=\"results_section_wrapper overview border\">";
			
			str+="	<div class=\"results_section_header section_header \">";
			str+="		<div class=\"title\">"+section.label+"</div>";
			str+="		<div class=\"view_all\">";
			str+="			<a href=\"javascript:;\" id=\"view_all_"+section.id+"\" class=\"view_all_link\">";
			str+=				parent.parent.config.translations.view_all+" <img src=\""+parent.parent.config.images.view_all_rt_arrow+"\" />";
			str+="			</a>";
			str+="		</div>";
			str+="	</div>";
			str+="	<div class=\"results_section_content\" id=\"overview_"+section.id+"\" ></div>";
			str+="</div>";
						
			self.container.append(str);
			self.container.find('a#view_all_'+section.id).click(function()
			{
				parent.scrollToTop();
				parent.parent.floater.hide();
				parent.open_tab(	JQ(this).attr('id').replace('view_all_','')	);
			});
		};
		self.init();
	}
	
	function SearchPaging(per_page,parent,area)
	{
		var self=this;
		this.init=function()
		{
			self.total=0;
			self.page=1;
			self.numbers=1;
			
			self.per_page=per_page;
		};
		this.set_total=function(total)
		{
			self.total=total;
			self.total_pages=Math.ceil(self.total/self.per_page);
		};
		this.hide=function()
		{
			if(self.container) self.container.hide();
		};
		this.show=function()
		{
			self.render();
			if(self.container) self.container.show();
		};		
		this.set_page=function(page)
		{
			self.page=page;
		};
		this.render=function()
		{
			if(self.total==0) return;

			if(!self.container)
			{
				if(area=="TOP") self.container=parent.container.find('.top_paging');
				else self.container=parent.container.find('.bot_paging');
				
				self.container.show();
			}
			
			var str="";
			str+="<span class=\"total_items\">"+self.total+" <span class=\"tiny_items\">"+parent.parent.parent.config.translations.items+"</span></span>";
						
			if(self.total_pages>1)
			{
				if(self.page>1)
					str+="<a href=\"javascript:;\" class=\"prev\" ><img src=\""+parent.parent.parent.config.images.paging_left+"\" /></a>";
				//else
					//str+="<a href=\"javascript:;\" class=\"prev invisible\" ><img src=\""+parent.parent.parent.config.images.paging_left+"\" /></a>"
				//get starting and ending # values:
				var j=self.total_pages;
				while(	j>(self.page-self.numbers)	&&	j>1 	)
					j--;
				start=j;
				
				end=start+2*self.numbers;
				if(end>self.total_pages) end=self.total_pages;
				
				while(start>1 && (end-start)<(2*self.numbers)) start--;
				
				if(start>1) str+="<a href=\"javascript:;\" class=\"digit inactive tiny_digit\" rel=\"1\">1&nbsp;...</a>";
				
				for(var i=start;i<=end;i++)
				{
					str+="<a href=\"javascript:;\" ";
					if(self.page==i) str+="class=\"digit active\"";
					else str+="class=\"digit inactive\"";
					str+="rel=\""+i+"\" >"+i+"</a>";
				}
				
				if(end<self.total_pages)
					str+="<a href=\"javascript:;\" class=\"digit inactive tiny_digit\" rel=\""+self.total_pages+"\">...&nbsp;"+self.total_pages+"</a>";
				
				if(self.page<self.total_pages)	
					str+="<a href=\"javascript:;\" class=\"next\" ><img src=\""+parent.parent.parent.config.images.paging_right+"\" /></a>";
				else
					str+="<a href=\"javascript:;\" class=\"next invisible\" ><img src=\""+parent.parent.parent.config.images.paging_right+"\" /></a>";
			}
			self.container.html(str);
			
			self.container.find('a.prev').click(function(){	if(!parent.loading){parent.parent.scrollToTop();parent.render_page(self.page-1);}		});
			self.container.find('a.next').click(function(){	if(!parent.loading){parent.parent.scrollToTop();parent.render_page(self.page+1);}		});
			self.container.find('a.digit').not('.active').click(function(){	if(!parent.loading){parent.parent.scrollToTop();parent.render_page(parseInt(JQ(this).attr('rel'),10));} });
		};
		self.init();
	}
	
	function GetParam(x)
	{
		x=x.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		var regexS="[\\?&]"+x+"=([^&#]*)";
		var regex=new RegExp(regexS);
		var results=regex.exec(window.location.href);
		if(results==null)
			return "";
		else
			return results[1];
	}
	
	function limit_string(text, maxlength)
	{
		text=text.replace(/(<([^>]+)>)/ig,""); 
		if(text.length <= maxlength)
			return text;
		var str_check=/ |.|!|#|@|,/;
		for(var i=maxlength;i>0;i--)
		{
			if(	text[i]==" "||text[i]=="#"||text[i]=="!"||text[i]=="\""||text[i]=="'"||text[i]==","||text[i]=="."||text[i]=="/")
				return text.substring(0,i)+"...";
		}
		return text.substring(0,maxlength)+"...";
	}
	
	String.prototype.ucfirst = function()
	{
	   var x = this.split(/\s+/g);
	   for(var i = 0; i < x.length; i++)
	   {
	      var parts = x[i].match(/(\w)(\w*)/);
		  if (parts) {x[i] = parts[1].toUpperCase() + parts[2].toLowerCase()};
	   }
	   return x.join(' ');
	};
	
	function str_replace(search, replace, subject)
	{
    	var f=search,r=replace,s=subject;
    	var ra=r instanceof Array, sa=s instanceof Array, f=[].concat(f), r=[].concat(r), i=(s=[].concat(s)).length;
 
    	while (j = 0, i--)
    	{
        	if (s[i])
            	while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
		};
    	return sa?s:s[0];
	}	
