var ACManualSearch = {

	'manuals' : {},
	'pageNumber': 1,
	'locale': 'en_US',
	'akamaiUrl': 'http://km.support.apple.com',
	// Object for retaining search state between AJAX calls - instantiated with defaults
 	'searchState' : { state: "browse", searchTerm: "", facet: "all", sort: "alphabetical", category: "", offset: 0, results: 0 },
 	'localized': {},
 	'pageNamePrefix':'acs::kb::man',
 	
 	// getting set up!
 	'initialize': function() {
		// defining the function that is called after there has been a change in the product browser
		ACProductBrowser.callbackTrigger = function(strID) {
			ACManualSearch.searchState.facet = 'all';
			ACManualSearch.searchAJAX(0, 'recency', strID, 'state_browse');
		};
		
		ACProductBrowser.searchObject = ACManualSearch;
		ACRecentProducts.searchObject = ACManualSearch;
		
		ACProductBrowser.unitDimensions = $('pb-listing').getDimensions();
		ACProductBrowser.doctype = 'MANUALS';
		
		// get first level no matter what
		ACProductBrowser.displayProducts(ACProductBrowser.rootProduct, undefined, undefined, false, function() {
			
			var locationString = new String(document.location);
			if(locationString[locationString.length-1]=='/') {
				// means there is a trailing /
				locationString = locationString.substring(0, locationString.length-1);
			}
			var locationParts = locationString.split('/');
			
			// support for anchor URLs
			if(locationString.indexOf("#")!=-1) {
				locationAnchorParts = locationString.split('#');
				if(locationParts[3].indexOf("_")==-1) {
					locationParts[4] = locationAnchorParts[1];
				}
				else {
					locationParts[5] = locationAnchorParts[1];
				}
			}
			
			if(locationParts[locationParts.length-1].indexOf("_diy")!=-1) {
				ACManualSearch.searchState.facet = 'diy';
				locationParts[locationParts.length-1] = locationParts[locationParts.length-1].replace("_diy", "");
			}
			
			// load product specific browser and search results if one is specified in the URL
			if(locationString.indexOf("index?page=")==-1 && 
				((locationParts[3].indexOf("_")==-1 && locationParts.length>4) || (locationParts[3].indexOf("_")!=-1 && locationParts.length>5)) && locationParts[locationParts.length-1]!='') {
				
				var prodName = locationParts[locationParts.length-1].toLowerCase();
				
				ACProductBrowser.checkAndLoadProduct(prodName, function() {
					ACManualSearch.searchAJAX(0, 'recency', ACProductBrowser.currentID, 'state_browse');
					ACManualSearch.toggleFacets(ACProductBrowser.currentID);
				});
		
			}
			else {
				ACProductBrowser.displayProducts(ACProductBrowser.rootProduct);
				ACManualSearch.searchAJAX(0, 'recency', ACProductBrowser.rootProduct, 'state_browse');
			}
			
		});
	
	},
	
	'searchAJAX' : function(offset, sorting, category, filterName) {
		
		if(filterName!==undefined) {
			var filterType = filterName.substr(0, filterName.indexOf("_"));
			var filterValue = filterName.substr(filterName.indexOf("_")+1, 35);
			ACManualSearch.searchState[filterType] = filterValue;
		}
		
		// make sure to redirect any non English query to the old Google search
		if(ACManualSearch.searchState.state=='search' && ACManualSearch.locales.indexOf(ACManualSearch.locale)==-1) {
			var multiCodedGSALangs = ['zh_CN','zh_TW','pt_PT','pt_BR'];
			var lang = (multiCodedGSALangs.indexOf(ACManualSearch.locale)>-1) ? ACManualSearch.locale.replace("_","-") : ACManualSearch.locale.substring(0,2);
			window.location = 'http://search.info.apple.com/index.html?lr=lang_' + lang + '&q=' + ACManualSearch.searchState.searchTerm + '&search=Go&type=kmanual';
			return;
		}
		
		// hide all elements first
		$('results-Support-ul').hide();
		$('filter').hide();
		$('facets').hide();
		$('sortbar').hide();
		$('results_none').hide();
		$('pagination_top').hide();
		$('pagination_bottom').hide();
		$('query').hide();
		
		$('query').innerHTML = '';
		
		$('loading').style.display='block';
		
		if(offset!=undefined) {
			if(offset==0) {
				ACManualSearch.searchState.offset = 0;
			}
			else {
				ACManualSearch.searchState.offset = ACManualSearch.searchState.offset+offset;
				if(ACManualSearch.searchState.offset<0) {
					ACManualSearch.searchState.offset = 0;
				}
			}
			
		}
		if(sorting!=undefined) {
			ACManualSearch.searchState.sort = sorting;
			if(sorting=='alphabetically') {
				ACManualSearch.activateSortingAlphabetically();
			}
			else {
				ACManualSearch.activateSortingRecency();
			}
		}
		
		if(category!=undefined && category=='MAIN_PRODUCTS') {
			ACManualSearch.searchState.category = '';
		}
		else if(category!=undefined) {
			ACManualSearch.searchState.category = category;
		}
		
		getUrl = '/kb/index?page=manuals_' + ACManualSearch.searchState.state;
		getUrl += '&offset=' + ACManualSearch.searchState.offset;
		getUrl += '&sort=' + ACManualSearch.searchState.sort;
		getUrl += '&facet=' + ACManualSearch.searchState.facet;
		
		// if serial number search, send all three levels and make it non hierarchical
		if(typeof ACManualSearch.searchState.category == 'object') {
			getUrl += '&category=' + escape(ACManualSearch.searchState.category.join(" "));
			getUrl += '&hierarchicalcategories=false';
		}
		else {
			getUrl += '&category=' + ACManualSearch.searchState.category;
		}

		if(ACManualSearch.searchState.state=="search") {
			ACProductBrowser.displayRows(0);
			getUrl += '&q=' + unescape(ACManualSearch.searchState.searchTerm);
			
			if(ACUtil.readCookie('s_vi')!==null) {
				// pass site catalyst session ID for reporting
				getUrl += '&sitecatalystid=' + escape(ACUtil.readCookie('s_vi'));
			}
		}
		else {
			// use akamai
			getUrl = ACManualSearch.akamaiUrl + getUrl;
		}
		
		getUrl += '&locale=' + ACManualSearch.locale;
		
		var dynamicScript = new JSONscriptRequest(getUrl + '&callback=ACManualSearch.showResults');
		
		if(dynamicScript.headLoc) {
		
			try{
				dynamicScript.buildScriptTag();
				dynamicScript.addScriptTag();
			}
			catch(ex) {
				// IE 5 for Mac will throw an exception here.
			}
		}
		
		if(ACManualSearch.searchState.state=="browse") {
			var reportProduct = ACProductBrowser.getProduct(ACManualSearch.searchState.category);
			
			var productTitle = reportProduct!==undefined ? reportProduct.name : undefined;
			if(reportProduct!==undefined && reportProduct.parentid!='MAIN_PRODUCTS') { 
				productTitle = ACProductBrowser.getProductName(reportProduct.parentid) + "::" + productTitle;
			}
			
			if (productTitle!=undefined){
				window.setTimeout("ACUtil.clickTracking(\"" + ACManualSearch.pageNamePrefix + "::" + productTitle + "\");", 800);
			}
		}
		
	},
	
	'showResults': function(json) {
		manuals = json;
		$('loading').style.display='none';
		$('results_none').hide();
		
		// display title
		if(ACManualSearch.searchState.state=='browse' && ACManualSearch.searchState.category!="") {
			// if level is lower then what exists in product browser, use the ID that is shown in product browser
			var manualsName = ACProductBrowser.getProductName(ACManualSearch.searchState.category, ACProductBrowser.genericProducts);
			manuals.name = manualsName ? manualsName : ACProductBrowser.getProductName(ACProductBrowser.currentID, ACProductBrowser.genericProducts);
		}
		
		ACManualSearch.toggleFacets(ACProductBrowser.currentID);
		
		if(manuals.name) {
			$('query').innerHTML = "<h3>" + manuals.name + "</h3>";
			$('query').show();
		}
		else {
			$('query').hide();
		}
		
		var numManuals = manuals.manuals.length;
		
		if(numManuals>0) {
			$('results_total').innerHTML = manuals.totalresults;
			$('results_from').innerHTML = ACManualSearch.searchState.offset+1;
			
			//console.log(manuals.totalresults + "--" + ACManualSearch.pageNumber*10);
			if(manuals.totalresults > ACManualSearch.searchState.offset+10) {
				$('results_until').innerHTML = ACManualSearch.searchState.offset+10;
			}
			else {
				$('results_until').innerHTML = manuals.totalresults;
			}
			
			if(manuals.totalresults>10) {
				var paginationDirection = "";
				if(manuals.totalresults > ACManualSearch.searchState.offset+10 && ACManualSearch.searchState.offset>0) {
					paginationDirection = "both";
				}
				else if(manuals.totalresults > ACManualSearch.searchState.offset+10) {
					paginationDirection = "next";
				}
				else {
					paginationDirection = "previous";
				}
				ACManualSearch.activatePagination($('pagination_top'), paginationDirection);
				ACManualSearch.activatePagination($('pagination_bottom'), paginationDirection);
				
				$('pagination_top').show();
				$('pagination_bottom').show();
			}
			else {
				$('pagination_top').hide();
				$('pagination_bottom').hide();
			}
			
			var collapser = '<div class="languages collapse"><a href="javascript:void(0);" onclick="ACUtil.toggleCollapse(this.parentNode);return false;" style="margin-left: -20px; padding-left: 20px;">' + ACManualSearch.localized.languages + '</a></div>';
			
			var resultList = "";
			for(i=0;i<numManuals;i++) {
				var aHref = "<a onclick=\"ACRecentProducts.add('" + manuals.manuals[i].productname + "', '" + manuals.manuals[i].parent + "');ACUtil.clickTracking('" + ACManualSearch.pageNamePrefix + "::" + manuals.manuals[i].title.replace('\'', '\\\'') + "');\" href=\"" + (manuals.manuals[i].answerurl ? manuals.manuals[i].answerurl : manuals.manuals[i].url) + "\">";
				resultList += "<li class=\"top-results dt-thumbnail\"><div class=\"thumbnail\">" + aHref + "<img src=\"" + ACManualSearch.akamaiUrl + manuals.manuals[i].thumbnail + "\"></a></div>";
				resultList += "<h3>" + aHref + manuals.manuals[i].title + "</a></h3>";
				
				if(ACManualSearch.searchState.state=="browse") {
					if(manuals.manuals[i].description && ACManualSearch.searchState.category!="") { 
						resultList += "<div class=\"desc\">" + manuals.manuals[i].description + "</div>";
					}
					resultList += "<div class=\"meta\">" + manuals.manuals[i].lastmodified + " - " + manuals.manuals[i].filesize + "</div>";
					if(manuals.manuals[i].languages!="" && ACManualSearch.searchState.category!="") {
						resultList += collapser + '<div class="languages-list" style="display: none;">' + manuals.manuals[i].languages + '</div>';
					}
					resultList += '</li>\n';
				}
				else {
					resultList += "<div class=\"desc\">" + manuals.manuals[i].excerpt + "</div>";
					resultList += "<div class=\"meta\">" + manuals.manuals[i].url + "</div></li>\n";
				}
			}
			
			if(ACManualSearch.searchState.state=='browse' && ACManualSearch.searchState.category=="") {
				$('sortbar').hide();
				$('filter').hide();
				$('pagination_top').hide();
				$('pagination_bottom').hide();
				
				$('results').getElementsByTagName('ul')[0].className="featured";
			}
			else {
				$('filter').show();
				if(ACManualSearch.searchState.state=='browse') {
					$('sortbar').show();
				}
				
				$('results').getElementsByTagName('ul')[0].className="results";
			}
			
			$('results-Support-ul').innerHTML = resultList;
			$('results-Support-ul').show();
			
		}
		else {
			ACManualSearch.resultsNone();
		}
		
	},
	
	'toggleFacets': function(strID) {
		var jsonLevel = ACProductBrowser.getLevel(ACProductBrowser.products, strID);
		if(jsonLevel && jsonLevel.diy=="true" && !ACUtil.validateSerialNumber(ACManualSearch.searchState.searchTerm)) {
			$('facets').style.display = "block";
			
			if(ACManualSearch.searchState.facet=="diy") {
				ACManualSearch.applySearchFilters($('facets'), 'facet_diy');
			}
			else {
				ACManualSearch.applySearchFilters($('facets'), 'facet_all');
			}
		}
		else {
			$('facets').style.display = "none";
		}
	},
	
	'resultsNone': function() {
		$('loading').hide();
		$('results-Support-ul').hide();
		$('filter').hide();
		$('facets').hide();
		$('sortbar').hide();
		$('pagination_top').hide();
		$('pagination_bottom').hide();
		$('query').hide();
		
		$('results_none').show();
	},
	
	'searchWithTerm': function() {
		
		if($F('searchsupport')!="") {
			window.location = "#" + $F('searchsupport');
			ACManualSearch.searchState.searchTerm = ACUtil.trim($F('searchsupport'));
			
			if(ACManualSearch.searchState.searchTerm.match(/^[a-zA-Z]{2,3}\d{1,6}$/)) {
				window.location.assign('/kb/' + ACManualSearch.searchState.searchTerm);
			}
			else if(ACUtil.validateSerialNumber(ACManualSearch.searchState.searchTerm)) {
				// now check if we can find a product id based on serial number 
				new Ajax.Request("/kb/index?page=categorydata&serialnumber=" + ACManualSearch.searchState.searchTerm, {
					method:'get',
					onSuccess: function(transport) {
						var category = transport.responseText.evalJSON();
						ACManualSearch.searchState.category = [category.id, category.parent, category.grandparent];
						if(category && category.parent && ACProductBrowser.productExists(category.parent)) {
							ACProductBrowser.changeLevel(category.parent, ACManualSearch.searchState.category);
						}
						else if(category && category.grandparent && ACProductBrowser.productExists(category.grandparent)) {
							ACProductBrowser.changeLevel(category.grandparent, ACManualSearch.searchState.category);
						}
						else {
							ACManualSearch.resultsNone();
						}
						// make sure serial number stays in box
						$('searchsupport').value = ACManualSearch.searchState.searchTerm;
					},
					onFailure: function() { 
						if(typeof console != 'undefined') console.log('Could not receive data from category API. Please try again.');
						ACManualSearch.resultsNone();
					}
				});
			}
			else {
				ACManualSearch.searchAJAX(0, 'relevancy', '', 'state_search');
			}
			
		}
		
	},
	
	'applySearchFilters': function(element, selectedFilter) {
	
		var lis = element.getElementsByTagName('li');
		for(var i=0;i<lis.length;i++){
		  var li = lis[i];
		  var elementId = li.getElementsByTagName('a')[0].getAttribute('id');
		  
		  var elementShortId = elementId.substr(elementId.indexOf("_")+1,15);
		
		  if(elementId==selectedFilter) {
			Element.addClassName(li.getElementsByTagName('a')[0], 'selected');
		  }
		  else {
		  	Element.removeClassName(li.getElementsByTagName('a')[0], 'selected');
		  }
		  
		  li.onclick = function(element) {
			  var elementId = this.getElementsByTagName('a')[0].getAttribute('id');
	
			  ACManualSearch.searchAJAX(0, undefined, undefined, elementId);
			  ACManualSearch.removeCategorySelection(this.parentNode);
			  Element.addClassName(this.getElementsByTagName('a')[0], 'selected');
			  return false;
		  };
		  
		}
	},
	
	'removeCategorySelection' : function(element){
		 var lis = $(element).getElementsByTagName('li');
		 for(var i=0;i<lis.length;i++){
			var li = lis[i];
			Element.removeClassName(li.getElementsByTagName('a')[0], 'selected');
		 }
	},
	
	'sortingToggle': function(type) {
		if(type=="recency") {
			ACManualSearch.activateSortingRecency();
			ACManualSearch.searchAJAX(0, 'recency');
		}
		else if(type=="alphabetically") {
			ACManualSearch.activateSortingAlphabetically();
			ACManualSearch.searchAJAX(0, 'alphabetically');
		}
	},
	
	'activateSortingRecency' : function() {
		var sortbarRecent = $('sortbar').getElementsByTagName('div')[1];
		
		var localizedRecentString = sortbarRecent.childNodes[0].innerHTML;
		sortbarRecent.innerHTML = "<span>" + localizedRecentString + "</span>";
		
		var sortbarAlphabetically = $('sortbar').getElementsByTagName('div')[2];
		
		var localizedAlphabeticallyString = sortbarAlphabetically.childNodes[0].innerHTML;
		sortbarAlphabetically.innerHTML = "<a href=\"javascript:ACManualSearch.sortingToggle('alphabetically');\">" + localizedAlphabeticallyString + "</a>";

		sortbarRecent.className = "button-selected";
		sortbarAlphabetically.className = "button-unselected";
	},
	
	'activateSortingAlphabetically' : function() {
		var sortbarAlphabetically = $('sortbar').getElementsByTagName('div')[2];
		
		var localizedAlphabeticallyString = sortbarAlphabetically.childNodes[0].innerHTML;
		sortbarAlphabetically.innerHTML = "<span>" + localizedAlphabeticallyString + "</span>";
		
		var sortbarRecent = $('sortbar').getElementsByTagName('div')[1];
		
		var localizedRecentString = sortbarRecent.childNodes[0].innerHTML;
		sortbarRecent.innerHTML = "<a href=\"#\" onclick=\"ACManualSearch.sortingToggle('recency');\">" + localizedRecentString + "</a>";
		
		sortbarAlphabetically.className = "button-selected";
		sortbarRecent.className = "button-unselected";
		
	},
	
	'activatePagination' : function(element, direction) {
		
		var localizedNextString = (element.getElementsByClassName('next')[0]!=undefined) ? element.getElementsByClassName('next')[0].innerHTML : '';
		var localizedPreviousString = (element.getElementsByClassName('previous')[0]!=undefined) ? element.getElementsByClassName('previous')[0].innerHTML : '';
		element.innerHTML = '';
		if(direction=="previous" || direction=="both") {
			element.innerHTML += "<a class=\"previous\" href=\"#\" onclick=\"ACManualSearch.searchAJAX(-10);return false;\">" + localizedPreviousString + "</a> | ";
		}
		else {
			element.innerHTML += "<span class=\"previous\">" + localizedPreviousString + "</span> | ";
		}
		
		if(direction=="next" || direction=="both") {
			element.innerHTML += "<a class=\"next\" href=\"#\" onclick=\"ACManualSearch.searchAJAX(10);return false;\">" + localizedNextString + "</a>";
		}
		else {
			element.innerHTML += "<span class=\"next\">" + localizedNextString + "</span>";
		}
		
	}
	
};
