/*
 * search overlay
 */
VISA.include_js("/js/jquery/jquery.bgiframe.min.js"); 
var search = null;
var partialWord = false;
var removeItem = "";
var searchReady = 0;	
var currentSearchTerm = null;

$(document).ready(function() {
	// If the locations match we are not in an iframe
    if(window.location == window.top.location) { 
		startContainer();
		getInput();
		handleEvents();

		$(".accessible").ajaxError(function() {
			hideSpinner();
		});

		$.preloadImages(
			"/img/search/search-overlay-arrow.gif",
			"/img/search/search-overlay-foot-gray.gif",
			"/img/search/search-overlay-head-gray.gif",
			"/img/search/search-overlay-bg-mid-white.gif",
			"/img/search/search-overlay-hover.gif",
			"/img/search/spinner.gif"
		);
	}
});

function startContainer() {
	var holder = $("<div>").attr("id", 'q-results');
	
	//browser sniff to impose relative positioning in IE6 ONLY
	//PLEASE DO NOT REMOVE

	if (jQuery.browser.msie) {
		if((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined)) {
			holder.css({"position":"relative"});
			holder.css({"top":"-9px"});
			holder.css({"left":"-48px"});
		}
	}	
	
	var inside = $("<div>").addClass("inside");
	var spinner = $("<img>").attr({src: "/img/search/spinner.gif", id: "q-search-spinner"});
	var siteUtilities = $("#siteUtilities");
	
	inside.appendTo(holder);
	spinner.appendTo(siteUtilities);
	siteUtilities.append(holder);
	
	$("head").append('<link href="/css/search-overlay.css" rel="stylesheet" type="text/css">');
	hideSpinner();
}

function getInput() {
	$("input#search").attr("autocomplete", "off").one("focus", function() {
		$.getJSON("/js/search/overlay-data.js", function(jsonData) {
			search = jsonData;
		});
	});

	$("input#search").keyup(searchKeypress);
}

function searchKeypress() {
	if(search) {
		if(searchReady > 0) {
			window.clearInterval(searchReady);
		}

		var searchInput = $.trim($("input#search").val().toLowerCase());
			
		if(searchInput.length >= 3) {
			if(searchInput != currentSearchTerm) {
				currentSearchTerm = searchInput;
			
				findMatches(searchInput);
			}
		} else {
			removeSuggestions();
		}
	} else if(searchReady == 0) {
		searchReady = window.setInterval(searchKeypress, 100);
	}
}

function handleEvents() {
	$('.inside').click(function(event) {
		var eventTarget = $(event.target);
		var link = null;
		var text = null;
		
		if(eventTarget.is('li.li-results')) {
			link = eventTarget.children('p.qLink').text();
			text = eventTarget.children('p.heading').text();
		} else {
			link = eventTarget.parents('li.li-results').children('p.qLink').text();
			text = $("p.heading", eventTarget.parents('li.li-results')).text();
		}

		if(link) {
			VISA.Analytics.event(event, {
				type: "clickSearchOverlay",
				item: text,
				page_context: "searchOverlay",
				application: "internalSearch",
				searchKeywords: $.trim($("input#search").val())
			});

			if (link.match(/^http/) && !VISA.has_USA_UI(link)) {
				window.open(link, "_blank");
			} else {
				window.location = link;
			}  
		} else {
			if(eventTarget.parents('li.featured').length > 0) {
				VISA.Analytics.event(event, {
					type: "clickSearchOverlay",
					item: "featuredLink",
					page_context: "searchOverlay",
					application: "internalSearch",
					searchKeywords: $.trim($("input#search").val()),
					featureDesc: eventTarget.attr("src")
				});
			} else if(eventTarget.attr('id') == 'search_closewindow') {
				removeSuggestions();
			} else if(eventTarget.attr('id') == 'submit-form') {
				removeSuggestions();
				$("#search").parents("form").get(0).submit();
			}		
		}
	});
	
	$("#search").parents("form").eq(0).submit(function(event) {
		VISA.Analytics.event(event, {
			type: "searchSubmit",
			item: "searchBox",
			page_context: "searchBox",
			application: "internalSearch",
			searchKeywords: $.trim($("input#search").val())
		});
	});
	
	$(document).click(function(event) { 
		var eventTarget = $(event.target);

		if(eventTarget.attr('id') != 'search') {
			removeSuggestions(); 
			hideSpinner();
		}
	});
	
	$("#q-results").bind("featureDisplayed", function(event, feature) { 
		VISA.Analytics.event(event, {
			type: "impression",
			item: "featuredLink",
			page_context: "searchOverlay",
			application: "internalSearch",
			searchKeywords: $.trim($("input#search").val()),
			featureDesc: feature
		});
	});
}

function findMatches(searchInput){
	showSpinner();
	removeSuggestions();

	if(search) {
		parseData(searchInput, search);
	}

	hideSpinner();		
}

function parseData(searchInput, jsonData) {
	var matches = [];
	var features = [];
	
	$.each(jsonData.terms,function(i,term) {
		if((partialWord && term.term.indexOf(searchInput) == 0) || (!partialWord && term.term == searchInput)) {
			if(term.featured) {
				$.each(term.featured,function(j,item) {
					features.push(item);
				});

				if(term.results) {
					$.each(term.results,function(j,item) {
						matches.push(item);
					});					
				}

				showFeatured(term.featured, features, matches, searchInput);
			} else if(term.results) {
				$.each(term.results,function(j,item) {
					matches.push(item);
				});
				
				renderMatches(matches, searchInput);
			}
			
			return false;
		}
	});
}

function renderMatches(matches, searchInput, featuredContent) {
	removeSuggestions();

	if(matches.length > 0 || featuredContent) {
		var list = $("<ul>").addClass("q-results").bgiframe();
		
		if(matches.length > 0) {		
			var resultsByCat = {};

			matches.unique();

			for (i=0; i<matches.length; i++){
				var match = matches[i];			
				var category 			= match.category;
				var descriptionCopy 		= match.description;
				var descriptionCharacters 	= 140;
				var titleCopy 			= "";
				var cleanTitle 	= unescape(match.title);
				var listResult 	= $("<li>").attr("id", 'q-result-' + i).addClass("li-results");
				var dv 		= $("<div>").addClass("hoverbox"); 
				var span 	= $("<div>").addClass("text"); 
				var header 	= $("<p>").addClass("heading").html(cleanTitle);
				var dest 	= $("<p>").text(match.url).addClass("qLink");
				var copy 	= $("<p>").html(descriptionCopy);
				var image = null;
	
				if (descriptionCopy.length > descriptionCharacters ) {
					descriptionCopy = descriptionCopy.substring(0, descriptionCopy.indexOf(" ", descriptionCharacters - 11 )) + "&hellip;";
				}
	
				descriptionCopy = unescape(descriptionCopy);
				
				if(match.image) {
					image = $("<img>").attr({src: match.image, alt: titleCopy});
				}
	
				header.appendTo(span);
				copy.appendTo(span);
				dest.appendTo(listResult);
				span.appendTo(listResult);
				
				if(image) {
					image.appendTo(dv);span.css({"width":"220px"});
				} else {
					span.css({"width":"300px", "position":"static"});
				}
				
				dv.appendTo(listResult);
	
				listResult.hover(function() {
					window.status = $(this).children('p.qLink').text();
	
					$(this).css({ "cursor":"pointer", "background-image":"url(/img/search/search-overlay-hover.gif)", "background-repeat":"no-repeat" });
					$(this).children(".text").children("p.heading").css({"text-decoration":"underline"});
				}, function() {
					window.status = "";
	
					$(this).css({ "cursor":"default", "background-image":"url(none)" });
					$(this).children(".text").children("p.heading").css({"text-decoration":"none"});
				});
				
				if(!resultsByCat[match.category]) {
					resultsByCat[match.category] = new Array();
				}
				
				resultsByCat[match.category].push(listResult);
			}
		
			var catClass = 'firstCat resultCat';
			
			for(var cat in resultsByCat) { 
				if(!resultsByCat.hasOwnProperty(cat)) {
					continue;
				}
	
				listResult = $("<li>").addClass(catClass).html(cat);
				catClass = 'resultCat';
				listResult.appendTo(list);
	
				for(var r = 0; r < resultsByCat[cat].length; r++) { 
					list.append(resultsByCat[cat][r]);			
				}	
			}
		}
	}
	
	$(".inside").append(list);
	$.ifixpng('/img/pixel.gif');
	$('img[src$=.png]').ifixpng(); //png fix for ie6
	
	if(featuredContent) {
		list.append(featuredContent);
	}

	showClosePanel();
	closeBtn();
}

function showFeatured(featuredResults, features, matches, searchInput) {
	var index = Math.floor(Math.random() * features.length);
	var feature = features[index];
	var featuredContent = null;

	if(matches.length > 0) {
		featuredContent = $('<li class="resultCat"><span>Featured</span></li><li class="featured"><a href="' + feature.url + '"><img src="' + feature.image + '" id=featured-image "' + '" alt="' + '"></a></li>');
		removeItem = feature.title;

		for(var l = 0; l < matches.length; l++) {
			if(matches[l].title == removeItem) {
				matches.splice(l, 1);
				break;
			}
		}	
	} else {
		featuredContent = $('<li class="firstCat resultCat"><span>Featured</span></li><li class="featured"><a href="' + feature.url + '"><img src="' + feature.image + '" id=featured-image "' + '" alt="' + '"></a></li>');
	}

	$("#q-results").trigger("featureDisplayed", feature.image);

	renderMatches(matches, searchInput, featuredContent);
}

function showClosePanel() {
	$('<li id="q-result-2" class="viewall"><div id="search_closewindow">Close Panel</div><a href="#" id="submit-form">View all search results</a></li>').appendTo("ul.q-results");
}

function closeBtn() {
	$("#search_closewindow").unbind("hover").hover(function() {
		$(this).css("cursor", "pointer");
		$(this).css("text-decoration", "none");
	}, function() {
		$(this).css("cursor", "auto");
		$(this).css("text-decoration", "underline");
	});
}

function removeSuggestions() {
	$("div.inside").empty();
}

function showSpinner() {
	$("#q-search-spinner").show();
}

function hideSpinner() {
	$("#q-search-spinner").hide();
}

Array.prototype.unique = function() {
	var skip = 0;
	
	o:for(var i = 0, n = this.length; i < n; i++) {
		for(var x = 0; x < i; x++) {
			if(this[x]==this[i]) {
				skip++;
				continue o;
			}
		}
		
		this[i - skip] = this[i];
	}
	
	this.length -= skip;
}

$.preloadImages = function() {
	for(var i = 0; i<arguments.length; i++) {
		$("<img>").attr("src", arguments[i]);
	}
};

/*
 * jQuery ifixpng plugin
 */
 
(function($){$.ifixpng=function(customPixel){$.ifixpng.pixel=customPixel;};$.ifixpng.getPixel=function(){return $.ifixpng.pixel||'/img/pixel.gif';};var hack={ltie7:$.browser.msie&&$.browser.version<7,filter:function(src){return"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='"+src+"')";}};$.fn.ifixpng=hack.ltie7?function(){return this.each(function(){var $$=$(this);var base=$('base').attr('href');if(base){base=base.replace(/\/[^\/]+$/,'/');}
if($$.is('img')||$$.is('input')){if($$.attr('src')){if($$.attr('src').match(/.*\.png([?].*)?$/i)){var source=(base&&$$.attr('src').search(/^(\/|http:)/i))?base+$$.attr('src'):$$.attr('src');$$.css({filter:hack.filter(source),width:$$.width(),height:$$.height()}).attr({src:$.ifixpng.getPixel()}).positionFix();}}}else{var image=$$.css('backgroundImage');if(image.match(/^url\(["']?(.*\.png([?].*)?)["']?\)$/i)){image=RegExp.$1;image=(base&&image.substring(0,1)!='/')?base+image:image;$$.css({backgroundImage:'none',filter:hack.filter(image)}).children().children().positionFix();}}});}:function(){return this;};$.fn.iunfixpng=hack.ltie7?function(){return this.each(function(){var $$=$(this);var src=$$.css('filter');if(src.match(/src=["']?(.*\.png([?].*)?)["']?/i)){src=RegExp.$1;if($$.is('img')||$$.is('input')){$$.attr({src:src}).css({filter:''});}else{$$.css({filter:'',background:'url('+src+')'});}}});}:function(){return this;};$.fn.positionFix=function(){return this.each(function(){var $$=$(this);var position=$$.css('position');if(position!='absolute'&&position!='relative'){$$.css({position:'relative'});}});};})(jQuery);